/***************************************************************/ /* 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 */ /* Modified 11/10/1999 to handle WORLD Soundings */ /* Modified 12/7/1999 to: Display Icing/Turbulence/Clouds */ /* Allow Point and Click for Model Data*/ /* Modified 1/4/2000 for Port of McIdas ICEMAP functionality */ /* Modified 8/18/2000 to: Display Plane Profiler/Vad Data */ /* Fix Sfc Temp=Dwpt Bug */ /* Modified 7/2001 to: Add Sampling functionality to planview */ /* Profiler/Vad data display with */ /* vertical profile/hodograph represent- */ /* ative of data at cursor location. */ /* Larry J. Hinson, Aviation Weather Center KCMO */ /* Modified 11/2002 to: correct dimension of time_list, */ /* time_list2, and mtime_list */ /* T. Piper/SAIC */ /* Modified 11/2002 to: correct calls to draw_map with */ /* regards to map_info variable */ /* L. Hinson/AWC */ /* L. Hinson: 10/03: Removed Assignment to GraphCid, SatCid, */ /* RadCid as these are now constants in xwprm.h */ /* L. Hinson: 10/03: Added idle routine to eliminate problem */ /* with pressures being clipped off left side. */ /* L. Hinson: 05/06: Add Stability Map 3 */ /* -------------------------------------------------- */ /* List of Routines in this module: */ /* */ /* X_Init */ /* setcliprgn */ /* setlinestyle */ /* getgtextextent */ /* moveto */ /* lineto */ /* rectangle */ /* setcolor */ /* set_font */ /* print_graphic */ /* reset_graphic */ /* parcel_popup */ /* */ /***************************************************************/ #define GLOBAL #define VIDEO #include #include #include #include "expdraw.h" #include "Xm/Scale.h" #include "Xm/SelectioB.h" #include "Xm/RowColumn.h" #include "Xm/ToggleB.h" #include "Xm/Scale.h" #include "vertprof.h" /***********/ /* LJH added includes */ #include #include #include /***********/ #define RESOURCE_FILE "Sharp95" void gemfile_times (); void mdlmap_pointer(); 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; #ifdef UNDERSCORE #define get_gem_times get_gem_times_ #define get_gem_stns get_gem_stns_ #define get_gem_snd get_gem_snd_ #define get_icing_fm_snd get_icing_fm_snd_ #define get_mdl_times get_mdl_times_ #define get_mdl_snd get_mdl_snd_ #define sncross sncross_ #define get_pvsoundings get_pvsoundings_ #define gqdev gqdev_ #define plot_indices plot_indices_ #endif /*-LJH added functions--*/ extern int file_select(); extern int alphasort(); void lf_loadmdlfiles_cb (Widget w, XtPointer client_data,XtPointer call_data ); void lf_cancel_cb (Widget w, XtPointer client_data,XtPointer call_data ); void AppendMdlFileToList ( Widget List, char* item); void getlist_mdlfilesCB (Widget List, char* item); void mdlmap_pointer(); void GetSoundingForLatLon(); static void getTimeOper (Widget w, XtPointer *call_data, XEvent *event); void getModelForTime (Widget w, XtPointer *call_data, XEvent *event); static void LoopBackward (XtPointer w, XtIntervalId* timer); static void LoopForward (XtPointer w, XtIntervalId* timer); void LoadSingleModelSounding(int g_act_sndg); /* End add */ void GetInterpPVSounding(); int UpdateTimeList(); int SGN(float x); void draw_model_map(); void GetSoundingForLatLon(); void mapw_pickstnCb(); void mapw_exposeCb(); void mapw_resizeCb(); void file_cb(); void show_textCb(); void print_gem_snd(float sndg[][7],int nlvl); void idle(double duration); void TvParcel_toggleCB(Widget widget, XtPointer client_data, XtPointer call_data); void parcelLevelactivateCB(Widget w, XtPointer client_data, XtPointer call_data); void scaleCB(Widget widget, XtPointer client_data, XtPointer call_data); void load_pfs_times(); void load_mdl_times(); nwxtbl_t *nwxTable; stnlist_t stnList; plotdata_t plotData; usrslct_t usrSelect; srchinfo_t srchInfo; struct maptype_list map_info[2]; mapbnd_t mapb; XtAppContext app; XFontStruct *font_struct=NULL; XPoint lpoints[2]; short pagenum = 1; int current_parcel = 4; rubber_band_data rbdata; Widget toplevel, gemfile_timelist, gemfile_text, gemfile_stationlist, gem_dialog, mdl_dialog, pfs_mdl_dialog,icemap_dialog,stabmap_dialog, mdlfile_timelist, pfsmdlfile_timelist, gcolrbar_frame, mdlfile_text, mdl_statext, sounding_text, user_defined_text, load_sharp, draw_reg, raob_btn, tamdar_btn, prof_btn, vad_btn, xsection_hght, gemlbl_station, gemlbl_station2, gemlbl_station3, icemap_station, stabmap_station, pv_station, pv_vertprof, pv_hodo, time_reg, time_oper_reg, pv_dialog,pvfile_timelist,psection_hght,pvpane,mdl_cursor_text; /* LJH added Widgets */ Widget lf_dialog; /*********************/ char gemsoundfile[200], time_list [500][20], time_list2[500][20], gemsoundtime[20], gemsoundsta[70], sta_id[5], mdlsoundfile[200], mdlsoundtime[200], mtime_list[500][24], mtimeac_list[500][24], mdlsoundsta[24], mdl_selected[5], x_hght[6], gemsoundraob[200], gemsoundtamdar[200], gemsoundprof[200], gemsoundvad[200]; int ntimes, mtimes, station_list, sounding_type = 999, item_type; int redisplay = 0; float user_level = 850.; char *levellist[] = { "3000", "5000", "8000", "10000", "12000", "15000", "18000", "20000", "25000", "30000", "40000", "50000", "60000" }; /* LJH Made Global */ char g_pattern[20]; char g_pathname[400]; char g_pfs_pathname[400]; char g_pfs_mdlsoundfile[200]; struct dirent **g_mdlfiles; int g_mfcountall=0; XrmDatabase g_applicationDB; char g_mdllist[7][10]; char g_pfsmdllist[7][10]; int g_nummdls=0; int g_numpfsmdls=0; int g_twdth=60; int nsta, g_nprofstns,g_nvadstns, ncolor, mrktyp, mrkwid, pltval, iposn, jcolr; float sta_lat[4000], sta_lon[4000], sta_elev[4000], sta_lat2[4000], sta_lon2[4000], sizmrk; char station_table[200], staid[4000][5], staname[30], idsta[5], station_tbl[12], sta_st[3], sta_coun[3], statlist[4000][18]; int markSW=0; int g_allModelParamsSW=0; int g_mlocationSelected=0; int g_raobModelSW=0; int g_pixcreated=0; int g_icemappixcreated=0; int g_pvmappixcreated=0; int g_WorldProj=0; int g_Proj=0; int g_nmtimes; int g_act_sndg=0; int g_newlev[49]; /* Extend from 20 Soundings to 49 */ int g_looping=0; int g_looponsw=0; char g_mdlsoundstawrk[80]; XtAppContext g_appcontext; int g_hghtno=2; char g_pvsound[80] = "\0"; int g_LNGC; /* int g_pfs_model_sel_sw=0; */ int g_lastmodelPFS=0; int g_pfs_mapset=0; float pvsndg[14][3][200]; float pvsndghodo[20][3][200]; float staxywrk[2][200]; float vawndwrk[200][39]; int wnddirs[20],wndspds[20],wndhts[20],wndcnt; /* int pvs_WDTH=949; */ /* int pvs_HGHT=800; */ int pvs_WDTH=830; int pvs_HGHT=750; unsigned levelshodo[20]={0,1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,12000, 14000,16000,18000,20000,25000,30000,35000,40000}; static XtIntervalId g_timer,g_pv_timer; static int g_pv_timersw=0; char g_msoundtimes[500][20]; char g_msoundfilenm[500][25]; float g_lng,g_lat,g_elev; char g_stabmap[]="map1"; float g_printctrl_l=17.0; float g_printctrl_w=11.0; Pixmap time_window,time_oper_window, icemap_window,pv_window; GC gc2, gc3; char g_proffile[200]; char g_vadfile[200]; int g_pv_timechange=0; char g_stnfilter[8]; /*NP*/ void X_Init( int argc, char *argv[]) /*************************************************************/ /* X_INIT */ /* John Hart NSSFC KCMO */ /* */ /* Draws basic SHARP graphic template on screen, including */ /* areas, buttons, and tables. */ /* */ /*************************************************************/ { Window gwin; int ret, i, xloc, yloc, iret; unsigned int wd, ht, bw, dpth; XrmOptionDescRec _nsharpOpts[] = { {"-v", "verbose", XrmoptionNoArg, "True"}, }; XmString load_st, sharp_st, sounding_st, pfs_st, model_st, about_st, crossx_st, plane_st, acars_st; Widget topform, print_button, inset_button, reset_button, parcel_button, GIF_button, interp_button, option_button, help_button, next_page, main_menu, graph_tog, graph_SKEWT, graph_HODO, graph_ICG, graph_TURB, graph_Clouds, menubar, load_menu, about_menu, show_text; /* LJH add */ char *str_type[20]; XrmValue value; char text1[80]; char resourcename[256]; /************/ /* ----- Initialize X Toolkit and Load Resources ----- */ toplevel = XtVaAppInitialize(&app, "Sharp95", _nsharpOpts, XtNumber(_nsharpOpts), &argc, argv, NULL, NULL, /* XmNbaseWidth, 780, XmNbaseHeight, 680, XmNminWidth, 860, XmNminHeight, 750, */ NULL); XtVaSetValues(toplevel, XmNbaseWidth, 780, XmNbaseHeight, 680, XmNminWidth, 860, XmNminHeight, 750, NULL); /* check resource file */ /* LJH alter to grab actual name of resource file */ /* NxmRes_check(XtDisplay(toplevel), RESOURCE_FILE, NULL); */ NxmRes_check(XtDisplay(toplevel), RESOURCE_FILE, resourcename); /* LJH addin to pull additional variables from Resource file */ if ((g_applicationDB=XrmGetFileDatabase(resourcename))==NULL) printf("Resource File %s not found\n", resourcename); /**LJH end */ NxmVers_showTitle(toplevel); /* ----- Create Graphics Form (window) ----- */ topform = XtVaCreateManagedWidget("graphic_form", xmFormWidgetClass, toplevel, XmNfractionBase, 56, NULL ); /* 28 to 56 */ /* ----- Create Menu bar across top of "topform" ----- */ load_st = XmStringCreateLocalized ("Load"); about_st = XmStringCreateLocalized ("About" ); menubar = XmVaCreateSimpleMenuBar ( topform, "menubar", XmVaCASCADEBUTTON, load_st, 'L', XmVaCASCADEBUTTON, about_st, 'A', XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL ); /* XmStringFree (load_st); */ /* XmStringFree (about_st); */ /* ----- Create About Menu Option ----- */ about_menu = XtNameToWidget(menubar, "button_1"); XtVaSetValues(menubar, XmNmenuHelpWidget, about_menu, NULL); XtAddCallback(about_menu, XmNactivateCallback, (XtCallbackProc)about_cb, NULL); /* ----- Create Pulldown Menu for Loading Soundings ----- */ sharp_st = XmStringCreateLocalized ("Archive Files"); sounding_st = XmStringCreateLocalized ("Observed Raobs"); model_st = XmStringCreateLocalized ("Model Soundings"); pfs_st = XmStringCreateLocalized("Point Fcst Soundings"); crossx_st = XmStringCreateLocalized ("Timesections"); plane_st = XmStringCreateLocalized ("Plane Profiler+Vad"); acars_st = XmStringCreateLocalized ("ACARS Soundings"); load_menu = XmVaCreateSimplePulldownMenu ( menubar, "load_menu", 0, load_cb, XmVaPUSHBUTTON, sharp_st, 'F', NULL, NULL, XmVaPUSHBUTTON, sounding_st, 'O', NULL, NULL, XmVaPUSHBUTTON, model_st, 'M', NULL, NULL, XmVaPUSHBUTTON, pfs_st,'P', NULL, NULL, XmVaPUSHBUTTON, crossx_st, 'T', NULL, NULL, XmVaPUSHBUTTON, plane_st, 'l', NULL, NULL, XmVaPUSHBUTTON, acars_st, 'A', NULL, NULL, NULL ); /* XmStringFree (sharp_st); XmStringFree (sounding_st); XmStringFree (model_st); XmStringFree (crossx_st); XmStringFree (plane_st); XmStringFree (acars_st); */ XtManageChild(menubar); /* ----- Initialize GEMPAK color palette ----- */ gemdisplay = XtDisplay(topform); gemmap = DefaultColormap(gemdisplay,DefaultScreen(gemdisplay)); gemvis = DefaultVisual(gemdisplay, DefaultScreen(gemdisplay)); xgbank(XtDisplay(topform), &ret); xcaloc(GraphCid, &ret); for ( i = 0; i < ColorBanks.banks[GraphCid]; i++) pixels[i] = ColorBanks.colrs[GraphCid][i]; /* ----- Create NAWIPS color bar ----- */ gcolrbar_frame = XtVaCreateManagedWidget("gcolrbar", xmFrameWidgetClass, topform, XmNtopAttachment,XmATTACH_POSITION, XmNtopPosition, 54, XmNbottomAttachment,XmATTACH_POSITION, XmNbottomPosition, 56, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); /* ----- Create main area for soundings/parameters ----- */ draw_reg = XtVaCreateManagedWidget("canvas", xmDrawingAreaWidgetClass, topform, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, menubar, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 45, XmNbackground, pixels[0], XmNwidth, 900, XmNheight, 620, NULL); /* ----- Create Area for plotting/Selecting Times */ time_reg = XtVaCreateManagedWidget("times", xmDrawingAreaWidgetClass, topform, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, draw_reg, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 34, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 48, XmNbackground, pixels[0], XmNwidth, 600, XmNheight, g_twdth, NULL); /* ----- Create Area for Time Operations */ time_oper_reg =XtVaCreateManagedWidget("timesoper", xmDrawingAreaWidgetClass, topform, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, draw_reg, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 34, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 48, XmNbackground, pixels[0], XmNwidth, 100, XmNheight,40, NULL); XtAddEventHandler(time_oper_reg, ButtonReleaseMask, FALSE, (XtEventHandler) getTimeOper,(XtPointer)NULL); XtAddEventHandler(time_reg, ButtonReleaseMask, FALSE, (XtEventHandler) getModelForTime,(XtPointer)NULL); /* ----- Create SKEWT/HODOGRAPH button ----- */ /*graph_tog = XtVaCreateManagedWidget("Hodograph", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 24, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 25, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL); XtAddCallback(graph_tog, XmNactivateCallback, (XtCallbackProc)tog_graph, NULL);*/ graph_SKEWT= XtVaCreateManagedWidget("SKEWT", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 48, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 50, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL); XtAddCallback(graph_SKEWT, XmNactivateCallback, (XtCallbackProc)display_SKEWT, NULL); graph_HODO= XtVaCreateManagedWidget("HODO", xmPushButtonWidgetClass, topform, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 48, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 50, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 8, NULL); XtAddCallback(graph_HODO, XmNactivateCallback, (XtCallbackProc)display_HODO, NULL); graph_ICG = XtVaCreateManagedWidget("Icing", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 50, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 52, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL); XtAddCallback(graph_ICG, XmNactivateCallback, (XtCallbackProc)display_ICG, NULL); graph_TURB = XtVaCreateManagedWidget("TURB", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, graph_ICG, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 50, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 52, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 8, NULL); XtAddCallback(graph_TURB, XmNactivateCallback, (XtCallbackProc)display_TURB, NULL); graph_Clouds = XtVaCreateManagedWidget("Clouds", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_FORM, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 52, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 54, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 8, NULL); XtAddCallback(graph_Clouds, XmNactivateCallback, (XtCallbackProc)display_Clouds, NULL); /* ----- Create EXIT button ----- */ main_menu = XtVaCreateManagedWidget("Exit", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 8, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 48, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 54, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 16, NULL); XtAddCallback(main_menu, XmNactivateCallback, (XtCallbackProc)menu_main, NULL); /* ----- Create PRINT button ----- */ print_button = XtVaCreateManagedWidget("PRINT", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 16, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 50, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 48, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 24, NULL); XtAddCallback(print_button, XmNactivateCallback, (XtCallbackProc)print_graphic, NULL); GIF_button = XtVaCreateManagedWidget("SAVE GIF", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 16, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 52, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 50, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 24, NULL); XtAddCallback(GIF_button, XmNactivateCallback, (XtCallbackProc)Make_Gif, NULL); /* ----- Create RESET button ----- */ reset_button = XtVaCreateManagedWidget("RESET", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 24, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 50, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 48, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 32, NULL); XtAddCallback(reset_button, XmNactivateCallback, (XtCallbackProc)reset_graphic, NULL); /* ----- Create PARCEL button ----- */ parcel_button = XtVaCreateManagedWidget("PARCEL", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 32, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 50, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 48, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 40, NULL); XtAddCallback(parcel_button, XmNactivateCallback, (XtCallbackProc)parcel_popup, NULL); /* ----- Create INSET button ----- */ inset_button = XtVaCreateManagedWidget("INSET", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 16, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 54, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 52, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 24, NULL); XtAddCallback(inset_button, XmNactivateCallback, (XtCallbackProc)inset_graphic, NULL); /* ----- Create INTERP button ----- */ interp_button = XtVaCreateManagedWidget("INTERP", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 24, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 54, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 52, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 32, NULL); XtAddCallback(interp_button, XmNactivateCallback, (XtCallbackProc)interp_data, NULL); /* ----- Create OPTIONS button ----- */ option_button = XtVaCreateManagedWidget("OPTIONS", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 32, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 54, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 52, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 40, NULL); XtAddCallback(option_button, XmNactivateCallback, (XtCallbackProc)option_graphic, NULL); /* ----- Create NEXT PAGE button ----- */ next_page = XtVaCreateManagedWidget("NEXT PAGE", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 40, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 48, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 54, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 48, NULL); XtAddCallback(next_page, XmNactivateCallback, (XtCallbackProc)page_next, NULL); /* ----- Create HELP button ----- */ /* help_button = XtVaCreateManagedWidget("HELP", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 24, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 24, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 27, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 28, NULL); */ /* ----- Create Show Text button ----- */ show_text = XtVaCreateManagedWidget("Show Text", xmPushButtonWidgetClass, topform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 48, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 48, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 54, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 56, NULL); XtAddCallback(show_text, XmNactivateCallback, (XtCallbackProc)show_textCb, NULL); /* * create print popup window */ NxmPrt_create( "datatop", topform, print_soundings); /* ----- Create Window and Map Screen ----- */ XtRealizeWidget( toplevel ); /* ----- Create "Graphic Context" ----- */ gc = XCreateGC(XtDisplay(draw_reg), XtWindow(draw_reg), 0, 0); /* ----- Create "Graphic Context" for time_reg Widget ----- */ gc2 = XCreateGC(XtDisplay(time_reg), XtWindow(time_reg), 0, 0); /* ----- Create "Graphic Context" for time_oper_reg Widget ---- */ gc3 = XCreateGC(XtDisplay(time_oper_reg), XtWindow(time_oper_reg), 0, 0); /* ----- callback for expose ----- */ XtAddCallback(draw_reg, XmNexposeCallback, (XtCallbackProc)expose_overlays, NULL); /* ----- callback for resize ----- */ XtAddCallback(draw_reg, XmNresizeCallback, (XtCallbackProc)resize_callback, NULL); /* ----- callback for time_reg expose ----- */ XtAddCallback( time_reg, XmNexposeCallback, (XtCallbackProc)expose_time_reg_overlays, NULL ); /* ----- callback for time_reg resize ----- */ XtAddCallback(time_reg, XmNresizeCallback, (XtCallbackProc)resize_time_reg_overlays, NULL); XtAddCallback(time_oper_reg, XmNexposeCallback, (XtCallbackProc)expose_time_oper_reg_overlays, NULL ); XtAddCallback(time_reg, XmNresizeCallback, (XtCallbackProc)resize_time_oper_reg_overlays, 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 ); root = DefaultRootWindow ( XtDisplay(draw_reg) ); XGetGeometry ( XtDisplay(draw_reg), XtWindow(draw_reg), &root, &xloc, &yloc, &wd, &ht, &bw, &dpth ); xwdth = wd; xhght = ht; xdpth = dpth; canvas = XCreatePixmap( XtDisplay(draw_reg), root, wd, ht, dpth ); strcpy ( x_hght , "25000" ); gwin = XtWindow(draw_reg); xmotifw(gwin, "datatop", gc, xwdth, xhght, xdpth, &iret); XFlush ( gemdisplay ); if( iret != 0 ) return; /* ----- Set background color to Black (pixels[0]) ----- */ XSetBackground ( XtDisplay(draw_reg), gc, pixels[0] ); XFillRectangle ( XtDisplay(draw_reg), canvas, gc, 0, 0, xwdth, xhght ); /* ----- Display NAWIPS color bar ----- */ NuiColorBarCreate( gcolrbar_frame, False); NuiColorEditPopup( topform ); /* ----- 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); if ( ! nobanner ) about_cb ( toplevel, NULL, NULL ); resize_callback ( draw_reg, (XtPointer)NULL, (XtPointer)NULL ); } /*NP*/ void setcliprgn(short tlx, short tly, short brx, short bry) /*************************************************************/ /* SETCLIPRGN */ /*************************************************************/ { Region regn; XRectangle rect; regn = XCreateRegion (); rect.x = tlx-1; rect.y = tly-1; rect.width = brx - tlx + 5; rect.height = bry - tly + 5; XUnionRectWithRegion ( &rect, regn, regn ); XSetRegion ( XtDisplay (draw_reg), gc, regn ); XDestroyRegion ( regn ); } /*NP*/ 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, n; static char dash_dash[] = {3,3}; static char dash_dot[] = {4,4,2,4}; static char dash_long[] = {3,3,6,3}; short line_width; if ( width < 0 || width > 10 ) line_width = 1; else line_width = 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 ); } } /*NP*/ int getgtextextent(char *st ) /*************************************************************/ /* GETGTEXTEXTENT */ /*************************************************************/ { return XTextWidth (font_struct, st, strlen(st) ); } /*NP*/ int getfontheight() { return font_struct->ascent+font_struct->descent; } /*NP*/ void moveto(short x, short y ) /*************************************************************/ /* MOVETO */ /*************************************************************/ { lpoints[0].x = x; lpoints[0].y = y; } /*NP*/ void lineto(short x, short y ) /*************************************************************/ /* LINETO */ /*************************************************************/ { lpoints[1].x = x; lpoints[1].y = y; XDrawLine(XtDisplay(draw_reg), canvas, gc, lpoints[0].x, lpoints[0].y, lpoints[1].x, lpoints[1].y ); lpoints[0].x = x; lpoints[0].y = y; } /*NP*/ void rectangle (int type, short x, short y, short width, short height ) /*************************************************************/ /* RECTANGLE */ /*************************************************************/ { if ( type == 0 ) { XDrawRectangle ( XtDisplay(draw_reg), canvas, gc, x, y, width - x, height- y ); } else if ( type == 1 ) { XFillRectangle ( XtDisplay(draw_reg), canvas, gc, x, y, width - x, height - y ); } } /*NP*/ void setcolor (int color ) /*************************************************************/ /* SETCOLOR */ /*************************************************************/ { XSetForeground(XtDisplay(draw_reg), gc, pixels[color] ); } /*NP*/ short set_font (short font ) /*************************************************************/ /* SET_FONT */ /*************************************************************/ { Font font_info; 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-*-*" }; static char font_6 [] = { "-adobe-courier-medium-r-normal-*-12-*-*-*-*-*-*-*"}; if ( font == 1 ) { font_info = XLoadFont(XtDisplay(draw_reg), font_1 ); } else if ( font == 2 ) { font_info = XLoadFont(XtDisplay(draw_reg), font_2 ); } else if ( font == 3 ) { font_info = XLoadFont(XtDisplay(draw_reg), font_3 ); } else if ( font == 4 ) { font_info = XLoadFont(XtDisplay(draw_reg), font_4 ); } else if ( font == 5 ) { font_info = XLoadFont(XtDisplay(draw_reg), font_5 ); } else if ( font == 6 ) { font_info = XLoadFont(XtDisplay(draw_reg), font_6 ); } XSetFont(XtDisplay(draw_reg), gc, font_info ); if(font_struct != NULL) XFreeFontInfo(NULL,font_struct,0); font_struct = XQueryFont ( XtDisplay(draw_reg), font_info); } /*NP*/ void print_graphic (Widget w, XmDrawingAreaCallbackStruct *call_data) /*************************************************************/ /* PRINT_GRAPHIC */ /*************************************************************/ { if ( mode != 3 ) { /* if ( numlvl > 0 ) */ /* LJH Removed 9-14-2001 */ /* print_sounding_hpgl (); */ print_sounding_ps(1); } else { NxmPrt_prtWPopup(); } } /*NP*/ void reset_graphic (Widget w, XmDrawingAreaCallbackStruct *call_data) /*************************************************************/ /* RESET_GRAPHIC */ /*************************************************************/ { if (!qc(i_temp(700))) return; if ( mode != 3 ) { restore_origsndg (); reset_options ( mode, pagenum ); XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); } } /*NP*/ static Widget rbutton[5]; void parcel_popup (Widget w) /*************************************************************/ /* PARCEL_POPUP */ /* */ /* Creates pop-up window to choose parcel. */ /*************************************************************/ { Arg args[5]; Cardinal argcnt; XmStringCharSet def_charset; static Widget parcel_pane, form, prcl_top=0; static Widget rowcol, form2, sep_wid, parcel_cancel; static Widget TvParcelCorToggle,ParcelToggle; int i; char *labels[] = { "Current Surface", "Forecast Surface", "Mean mixing layer", "Most unstable parcel", "Smallest CINH", "User Defined level" }; XmString pop_title; if (!qc(i_temp(700))) return; if ( mode != 3 ) { if ( ! prcl_top ) { def_charset = (XmStringCharSet) XmSTRING_DEFAULT_CHARSET; /* ----- Create a Dialog for parcel selection ----- */ pop_title = XmStringCreateLocalized( "Select Thermodynamic Parcel" ); prcl_top = XmCreateBulletinBoardDialog(w, "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 = XtVaCreateWidget("Parcel", xmRowColumnWidgetClass, form, XmNnumColumns, 2, XmNorientation, XmVERTICAL, XmNspacing, 4, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 2, NULL ); for (i=0; iset); if (strcmp((char *) client_data,"Parcel")==0) set_g_Parcel((int)ptr->set); redraw_graph(1); show_parcel(); XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); XFlush ( XtDisplay(draw_reg) ); } } /*NP*/ void inset_graphic (Widget w, XmDrawingAreaCallbackStruct *call_data) /*************************************************************/ /* INSET_GRAPHIC */ /*************************************************************/ { if (!qc(i_temp(700))) return; if ( mode != 3 ) inset_options( mode ); } /*NP*/ void interp_data (Widget w, XmDrawingAreaCallbackStruct *call_data) /*************************************************************/ /* INTERP_DATA */ /*************************************************************/ { if (!qc(i_temp(700))) return; if ( mode != 3 ) { interp_sndg(); redraw_graph( mode ); define_parcel( current_parcel, user_level ); show_parcel (); show_page( pagenum ); } } /*NP*/ void option_graphic (Widget w, XmDrawingAreaCallbackStruct *call_data) /*************************************************************/ /* OPTION_GRAPHIC */ /*************************************************************/ { if (!qc(i_temp(700))) return; overlay_previous += 1; if (overlay_previous == 2) overlay_previous = 0; if (overlay_previous == 0) { XtVaSetValues(w, XmNlabelString, XmStringCreateLocalized("Overlay: OFF"), NULL ); } if (overlay_previous == 1) { XtVaSetValues(w, XmNlabelString, XmStringCreateLocalized("Overlay: ON"), NULL ); } if ( mode != 3 ) general_options(); } /*NP*/ void expose_overlays (Widget w, XmDrawingAreaCallbackStruct *call_data) { /*************************************************************/ /* EXPOSE_OVERLAYS */ /*************************************************************/ XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); } /*NP*/ void resize_callback (Widget w, XtPointer *data, XmDrawingAreaCallbackStruct *call_data) /*************************************************************/ /*RESIZE_CALLBACK */ /*************************************************************/ { Dimension nwdth, nhght, xdim, ydim, ndist; char st[80]; int idwdth, idhght, iswdth, ishght, iret; XtVaGetValues ( draw_reg, XmNwidth, &nwdth, XmNheight, &nhght, NULL ); xdim = nwdth - 340 - skv.tlx - 20; ydim = nhght - skv.tly; if ( xdim < ydim ) ndist = xdim; else ndist = ydim; skv.brx = skv.bry = ndist; hov.brx = hov.bry = ndist; xwdth = nwdth; xhght = nhght; /**** Re-activated 11/3 for Resize events of the Window */ XFreePixmap ( XtDisplay(draw_reg), canvas ); root = DefaultRootWindow ( XtDisplay(draw_reg) ); canvas = XCreatePixmap ( XtDisplay(draw_reg), root, xwdth, xhght, 8 ); /****/ xclear(&idwdth, &idhght, &iswdth, &ishght, &iret); setcliprgn ( 1, 1, xwdth, xhght ); setcolor(0); XFillRectangle (XtDisplay(draw_reg), canvas, gc, 0, 0, xwdth, xhght ); if ( mode != 3 ) { /* ----- Parameter Area ----- */ setcolor(4); rectangle( 1, skv.brx + 20, skv.tly, xwdth-5, xhght-5); setcolor(1); rectangle( 0, skv.brx + 20, skv.tly, xwdth-5, xhght-5); /* ----- Cursor Data Area ----- */ setcolor(3); strcpy( st, "CURSOR DATA" ); outgtext ( st, (((skv.brx + 20 + xwdth) / 2) - (getgtextextent( st ) / 2)), skv.tly + 5 ); setcolor(0); rectangle( 1, skv.brx + 30, skv.tly + 22, xwdth-15, 100); setcolor(1); rectangle( 0, skv.brx + 30, skv.tly + 22, xwdth-15, 100); if ( mode == 1 ) { draw_skewt(); if ( numlvl > 0 ) { define_parcel( current_parcel, user_level); show_parcel (); } } else if ( mode == 2 ) draw_hodo(); else if ( mode == 4 ) draw_ICG(); else if (mode == 5) draw_TURB(); else if (mode == 6) draw_Clouds(); if (numlvl>0 && !(mode ==4 || mode == 5 || mode == 6 || g_looping)) show_page(pagenum); } else if (!(mode==4 || mode==5)) { Load_gem_sounding (); } if (g_pfs_model_sel_sw) { setcliprgn ( 1, 1, xwdth, xhght ); setcolor(5); set_font(2); strcpy(st,"Forecast Times:"); outgtext(st,0,xhght-12); } setcliprgn(1,1,xwdth,xhght); XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); XFlush(XtDisplay(draw_reg)); } /*NP*/ void position_cursor (Widget w, XtPointer *data, XEvent *event) /*************************************************************/ /* POSITION_CURSOR */ /* */ /* Handles "mouse button depressed" event */ /*************************************************************/ { short x, y, i, yy; float pres, temp, dwpt, tcur, d1, d2, chg1; char st[20], gemdevice[72]; int iret; /* LJH Added to correct temp=dwpt problem */ /* ----- "button released" event ----- */ XtAddEventHandler(draw_reg, ButtonReleaseMask, FALSE, (XtEventHandler)redraw_sounding, (XtPointer)NULL); /* ----- Determine if a button is pushed ----- */ if(event->xbutton.button == 1) { if (!qc(i_temp(700))) 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, rbdata.points[1].x, rbdata.points[1].y ); XDrawLine( XtDisplay(w), XtWindow(w), rbdata.gc, rbdata.points[1].x, rbdata.points[1].y, rbdata.points[2].x, 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 > sndg[sfc()][1]) { pres = sndg[sfc()][1]; } temp = i_temp( pres ); dwpt = i_dwpt( pres ); d1 = (float)fabs(tcur - temp); d2 = (float)fabs(tcur - dwpt); if( d1 < d2 ) { /* ----- Edit Temperatures ----- */ rbdata.itype = 0; rbdata.i = i = grab_level( pres ); if(!qc(sndg[i][3])) { sndg[i][3] = i_temp(sndg[i][1]); } /* ----- Move mouse to starting spot ----- */ rbdata.yy = yy = pres_to_pix(sndg[i][1]); XWarpPointer ( XtDisplay(draw_reg), XtWindow(draw_reg), XtWindow(draw_reg), skv.tlx, skv.tly, skv.brx+skv.tlx, skv.bry+skv.tly, temp_to_pix(sndg[i][3], sndg[i][1]), 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(sndg[i][3], sndg[i][1]); 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(sndg[i+1][3],sndg[i+1][1]); rbdata.points[2].y = pres_to_pix(sndg[i+1][1]); rbdata.ilev = 0; } else if ( i == numlvl -1 ) { rbdata.points[2].x = rbdata.points[1].x; rbdata.points[2].y = rbdata.points[1].y; rbdata.points[0].x = temp_to_pix(sndg[i-1][3],sndg[i-1][1]); rbdata.points[0].y = pres_to_pix(sndg[i-1][1]); rbdata.ilev = 1; } else { rbdata.points[0].x = temp_to_pix(sndg[i-1][3],sndg[i-1][1]); rbdata.points[0].y = pres_to_pix(sndg[i-1][1]); rbdata.points[2].x = temp_to_pix(sndg[i+1][3],sndg[i+1][1]); rbdata.points[2].y = pres_to_pix(sndg[i+1][1]); rbdata.ilev = 2; } } else { /* ----- Edit Dew Points ----- */ rbdata.itype = 1; rbdata.i = i = grab_level( pres ); if(!qc(sndg[i][4])) { sndg[i][4] = i_dwpt(sndg[i][1]); } /* ----- Move mouse to starting spot ----- */ rbdata.yy = yy = pres_to_pix(sndg[i][1]); XWarpPointer ( XtDisplay(draw_reg), XtWindow(draw_reg), XtWindow(draw_reg), skv.tlx, skv.tly, skv.brx+skv.tlx, skv.bry+skv.tly, temp_to_pix(sndg[i][4], sndg[i][1]), 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(sndg[i][4],sndg[i][1]); 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(sndg[i+1][4],sndg[i+1][1]); rbdata.points[2].y = pres_to_pix(sndg[i+1][1]); rbdata.ilev = 0; } else if ( i == numlvl -1 ) { rbdata.points[2].x = rbdata.points[1].x; rbdata.points[2].y = rbdata.points[1].y; rbdata.points[0].x = temp_to_pix(sndg[i-1][4],sndg[i-1][1]); rbdata.points[0].y = pres_to_pix(sndg[i-1][1]); rbdata.ilev = 1; } else { rbdata.points[0].x = temp_to_pix(sndg[i-1][4],sndg[i-1][1]); rbdata.points[0].y = pres_to_pix(sndg[i-1][1]); rbdata.points[2].x = temp_to_pix(sndg[i+1][4],sndg[i+1][1]); rbdata.points[2].y = pres_to_pix(sndg[i+1][1]); rbdata.ilev = 2; } } } else if ( mode == 2 ) { pix_to_hodo( (short)event->xbutton.x,(short)event->xbutton.y, &st_dir, &st_spd ); redraw_graph( mode ); show_page( pagenum ); XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, 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: redisplay = 1; strcpy ( gemdevice, "maptop" ); gslwin(gemdevice, &iret, strlen(gemdevice)); show_gem_info (w); break; case 2: redisplay = 1; strcpy( gemdevice, "maptop2"); gslwin(gemdevice, &iret, strlen(gemdevice)); show_model_info (w); break; case 3: redisplay = 1; strcpy( gemdevice, "maptop3"); gslwin(gemdevice, &iret, strlen(gemdevice)); show_pfs_model_info (w); break; case 4: redisplay = 1; show_gem_info (w); break; case 5: show_profiler_vad_info(w); break; case 6: redisplay = 1; show_acars_info (w); break; } } } /*NP*/ void pointer_update (Widget w, XtPointer *call_data, XEvent *event) /*************************************************************/ /* POINTER_UPDATE */ /* */ /* Handles "mouse moved w/ no buttons" event */ /*************************************************************/ { /* ----- Update Cursor Data when mouse is moved ----- */ set_font(2); if (mode == 1 || mode == 6) { if ((event->xbutton.x < skv.brx) && (event->xbutton.y < skv.bry)) skewt_cursor_data((short)event->xbutton.x, (short)event->xbutton.y); } else if ( mode == 2 ) { if ((event->xbutton.x < hov.brx) && (event->xbutton.y < hov.bry)) hodo_cursor_data((short)event->xbutton.x, (short)event->xbutton.y); } else if ( mode == 4 || mode == 5) { if ((event->xbutton.x < skv.brx) && (event->xbutton.y < skv.bry)) icing_turb_cursor_data((short)event->xbutton.x, (short)event->xbutton.y); } XFlush (XtDisplay(draw_reg)); } /*NP*/ void update_pointer (Widget w, XtPointer *call_data, XEvent *event) /*************************************************************/ /* UPDATE_POINTER */ /* */ /* Handles "mouse moved while button #1 was depressed" event */ /*************************************************************/ { if (!qc(i_temp(700))) return; if ( mode == 1 ) { XDrawLine( XtDisplay(w), XtWindow(w), rbdata.gc, rbdata.points[0].x, rbdata.points[0].y, rbdata.points[1].x, rbdata.points[1].y ); XDrawLine( XtDisplay(w), XtWindow(w), rbdata.gc, rbdata.points[1].x, rbdata.points[1].y, rbdata.points[2].x, 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, rbdata.points[1].x, rbdata.points[1].y ); XDrawLine( XtDisplay(w), XtWindow(w), rbdata.gc, rbdata.points[1].x, rbdata.points[1].y, rbdata.points[2].x, rbdata.points[2].y ); set_font( 2 ); skewt_cursor_data((short)event->xbutton.x, (short)rbdata.points[1].y ); } else if ( mode == 2 ) { pix_to_hodo( (short)event->xbutton.x,(short)event->xbutton.y, &st_dir, &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 ) ); } /*NP*/ void redraw_sounding (Widget w, XtPointer *call_data, XEvent *event ) /*************************************************************/ /* REDRAW_SOUNDING */ /*************************************************************/ { float chg1; short i; if (!qc(i_temp(700))) return; if(event->xbutton.button != 1 ) return; /* Redraw previous line */ if ( mode == 1 ) { XDrawLine( XtDisplay(w), XtWindow(w), rbdata.gc, rbdata.points[0].x, rbdata.points[0].y, rbdata.points[1].x, rbdata.points[1].y ); XDrawLine( XtDisplay(w), XtWindow(w), rbdata.gc, rbdata.points[1].x, rbdata.points[1].y, rbdata.points[2].x, rbdata.points[2].y ); if ( ! rbdata.itype ) { chg1 = pix_to_temp( (short)event->xbutton.x, rbdata.yy ); if(chg1 < i_dwpt(sndg[rbdata.i][1])) { chg1 = i_dwpt(sndg[rbdata.i][1]); } sndg[rbdata.i][3] = chg1; redraw_graph( mode ); define_parcel( current_parcel, user_level); show_parcel (); show_page( pagenum ); } else { chg1 = pix_to_temp( (short)event->xbutton.x, rbdata.yy ); if(chg1 > i_temp(sndg[rbdata.i][1])) { chg1 = i_temp(sndg[rbdata.i][1]); } sndg[rbdata.i][4] = chg1; redraw_graph( mode ); define_parcel( 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, xwdth, xhght, 0, 0 ); } else if ( mode == 2 ) { pix_to_hodo( (short)event->xbutton.x,(short)event->xbutton.y, &st_dir, &st_spd ); redraw_graph( mode ); show_page( pagenum ); XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); hodo_cursor_data( (short) event->xbutton.x, (short) event->xbutton.y ); XFlush ( XtDisplay ( draw_reg ) ); } } /*NP*/ void tog_graph (Widget w, XmDrawingAreaCallbackStruct *call_data) /*************************************************************/ /* TOG_GRAPH */ /*************************************************************/ { if ( mode != 3 ) { mode = switch_modes( mode ); if ( mode == 1 ) { XtVaSetValues(w, XmNlabelString, XmStringCreateLocalized("Hodograph"), NULL ); } else if ( mode == 2 ) { XtVaSetValues(w, XmNlabelString, XmStringCreateLocalized("Skewt"), NULL ); } XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); } } /*NP*/ void display_SKEWT (Widget w, XmDrawingAreaCallbackStruct *call_data) /*******************************************************************/ /* DISPLAY_SKEWT */ /*******************************************************************/ { pagenum = 1; clear_paramarea(); draw_skewt(); show_page( pagenum ); mode = 1; XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); } /*NP*/ void display_HODO (Widget w, XmDrawingAreaCallbackStruct *call_data) /*******************************************************************/ /* DISPLAY_HODO */ /*******************************************************************/ { pagenum = 2; clear_paramarea(); draw_hodo(); show_page( pagenum ); mode = 2; XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); } /*NP*/ void display_ICG(Widget w, XmDrawingAreaCallbackStruct *call_data) /****************************************************************/ /* DISPLAY_ICG */ /****************************************************************/ { draw_ICG(); mode=4; XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); } /*NP*/ void display_TURB(Widget w, XmDrawingAreaCallbackStruct *call_data) /*****************************************************************/ /* DISPLAY_TURB */ /*****************************************************************/ { draw_TURB(); mode=5; XCopyArea (XtDisplay(draw_reg),canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); } /*NP*/ void display_Clouds(Widget w, XmDrawingAreaCallbackStruct *call_data) /*******************************************************************/ /* DISPLAY_CLOUDS */ /*******************************************************************/ { draw_Clouds(); mode=6; XCopyArea (XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); } /*NP*/ void menu_main (Widget w, XmDrawingAreaCallbackStruct *call_data) /*************************************************************/ /* MAIN_MENU */ /*************************************************************/ { exit(0); } /*NP*/ void page_next (Widget w, XmDrawingAreaCallbackStruct *call_data) /*************************************************************/ /* PAGE_NEXT */ /*************************************************************/ { if (!qc(i_temp(700))) return; if ( mode != 3 ) { pagenum += 1; if(pagenum == 5) pagenum = mode; show_page( pagenum ); XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); } } /*NP*/ char * itoa ( int value, char *st, int radx ) /*************************************************************/ /* ITOA */ /*************************************************************/ { sprintf ( st, "%d", value ); return st; } /*NP*/ 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, strlen (st) ); } /*NP*/ void outgtext ( char *st, int x, int y ) /*************************************************************/ /* OUTGTEXT */ /*************************************************************/ { y = y + font_struct->ascent; XDrawString( XtDisplay(draw_reg), canvas, gc, x, y, st, strlen (st) ); } /*NP*/ void Toggle_Callback( Widget w, int which, caddr_t call) /*************************************************************/ /* TOGGLE_CALLBACK */ /*************************************************************/ { static int lastpick=-1; XmToggleButtonCallbackStruct *state = (XmToggleButtonCallbackStruct *) call; XtUnmanageChild( XtParent(XtParent(XtParent(XtParent(w))))); if ( which == 6 ) return; if((lastpick >= 0)&&(lastpick != which)) XtVaSetValues(rbutton[lastpick],XmNset,False,NULL); else XtVaSetValues(rbutton[which],XmNset,True,NULL); current_parcel = which+1; define_parcel( (short)(which+1), user_level ); redraw_graph(1); show_parcel(); XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); XFlush ( XtDisplay(draw_reg) ); lastpick = which; } /*NP*/ 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; } /*NP*/ void load_cb ( Widget w, XtPointer client_data, XtPointer call_data ) /*************************************************************/ /* LOAD_CB */ /*************************************************************/ { int i, newlev, item_no = (int) client_data; XmString title; XmStringTable str_list = NULL; sounding_type = item_no; /* Blacken Out Widget at Bottom of Screen if necessary*/ if (g_raobModelSW != 0) { XSetForeground(XtDisplay(time_reg), gc2, pixels[0] ); XFillRectangle (XtDisplay(time_reg), time_window, gc2, 0, 0, 600, g_twdth ); XCopyArea(XtDisplay(time_reg), time_window, XtWindow(time_reg), gc2, 0, 0, 600, g_twdth, 0, 0); XSetForeground(XtDisplay(time_oper_reg), gc3, pixels[0] ); XFillRectangle(XtDisplay(time_oper_reg),time_oper_window, gc3, 0, 0, 100, 40); XCopyArea(XtDisplay(time_oper_reg), time_oper_window, XtWindow(time_oper_reg), gc3, 0, 0, 100, 40, 0, 0); g_raobModelSW=0; } plotData.mode = EMPTY; g_pfs_model_sel_sw=0; 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); } XtManageChild(load_sharp); } else if (item_no == 1) { mode = 1; redisplay = 0; show_gem_info(w); XtSetSensitive( raob_btn, True ); XtSetSensitive( tamdar_btn, True ); XtSetSensitive( prof_btn, False ); XtSetSensitive( vad_btn, False ); XtSetSensitive( xsection_hght, False ); item_type = 1; gemfile_times (); gemsoundtime[0] = '\0'; Load_stationlist ( station_list ); } else if (item_no == 2 ) { mode = 1; redisplay = 0; if (mdlfile_timelist != NULL) XmListDeselectAllItems(mdlfile_timelist); if (pfsmdlfile_timelist != NULL) { /* Deselect and erase all items to fix bug with xfr between model soundings and point forecast soundings dialogue boxes. This forces forecaster to have to reload time list on switch, but this fixes problem with possible labelling problems showing up on switch over to point forecast soundings */ XmListDeselectAllItems(pfsmdlfile_timelist); XmListDeleteAllItems(pfsmdlfile_timelist); } show_model_info (w); draw_model_map(); } else if (item_no == 3 ) { mode = 1; redisplay = 0; if (pfsmdlfile_timelist != NULL) { XmListDeselectAllItems(pfsmdlfile_timelist); } if (mdlfile_timelist != NULL) { /* Deselect and erase all items to fix bug with xfr between point forecast soundings and model soundings dialogue boxes. This forces forecaster to have to reload time list on switch, but this fixes problem with no soundings showing up on switch over to regular model data */ XmListDeselectAllItems(mdlfile_timelist); XmListDeleteAllItems(mdlfile_timelist); } show_pfs_model_info (w); draw_model_map(); } else if (item_no == 4 ) { mode = 3; redisplay = 0; show_gem_info (w); XtSetSensitive( raob_btn, False ); XtSetSensitive( tamdar_btn, False ); XtSetSensitive( prof_btn, True ); XtSetSensitive( vad_btn, True ); XtSetSensitive( xsection_hght, True ); item_type = 2; XmListDeselectAllItems (gemfile_timelist); XtVaSetValues ( gemfile_timelist, XmNitemCount, 0, XmNitems, str_list, NULL ); gemfile_times (); gemsoundtime[0] = '\0'; Load_stationlist ( station_list ); } else if (item_no == 5 ) { mode=4; show_profiler_vad_info(w); } else if (item_no == 6) { mode = 1; redisplay = 0; show_acars_info (w); } } /*NP*/ void about_cb (Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* ABOUT_CB */ /* */ /* Displays ABOUT message */ /*************************************************************/ { static Widget aboutBox, temp; XmString msg, title; if (!aboutBox) { aboutBox = XmCreateMessageDialog( toplevel, "aboutBox", NULL, 0); title = XmStringCreateLocalized( "About SHARP version 3.00" ); msg = XmStringCreateLocalized( "Welcome to:" ); XtVaSetValues( aboutBox, XmNdialogTitle, title, NULL); /* XmStringFree( title ); XmStringFree( msg ); */ /* ----- Turn off CANCEL and HELP buttons ----- */ temp = XmMessageBoxGetChild( aboutBox, XmDIALOG_CANCEL_BUTTON); XtUnmanageChild(temp); temp = XmMessageBoxGetChild( aboutBox, XmDIALOG_HELP_BUTTON); XtUnmanageChild(temp); } XtManageChild(aboutBox); } /*NP*/ void sharp_load ( Widget w, XtPointer client_data, XtPointer call_data ) /*************************************************************/ /* SHARP_LOAD */ /*************************************************************/ { char *file = NULL, filename[200]; XmFileSelectionBoxCallbackStruct *cbs = (XmFileSelectionBoxCallbackStruct *) call_data; if (cbs) { if ( !XmStringGetLtoR (cbs->value, XmFONTLIST_DEFAULT_TAG, &file) ) return; strcpy ( filename, config.filename); strcpy ( config.filename, file ); XtFree (file); if ( get_sndg() ) { printf("\n Error reading file %s", config.filename ); strcpy ( config.filename, filename ); return; } mode = 1; resize_callback ( draw_reg, (XtPointer)NULL, (XtPointer)NULL ); define_parcel( current_parcel, user_level ); show_parcel (); pagenum = 1; show_page( pagenum ); } } /*NP*/ void show_gem_info ( Widget w ) /*************************************************************/ /* SHOW_GEM_INFO */ /* */ /* Display Observed Sounding Map and get user selection. */ /*************************************************************/ { static Widget gemform, gemform2, gempane, gemfile_label, gemfile_load, gemfile_ok, gemfile_cancel, gemfile_world, gemfile_US, gemfile_TROP_SFC, gemfile_OFAGX, gemfile_ATL, gemfile_PAC, gemfile_icemap, gemfile_stabmap, gemfile_zoom, gemfile_unzoom, gemfile_help, gemlbl_time, /*gemlbl_station, gemstn_opt, rc;*/ gemstn_opt,rc; XmString str, gem_title, *levels_str, xsection_lbl; XmStringTable str_list = NULL; char *gemouttext, gemdevice[72]; char *strp; int i, num, iret=0; float fraction=0.9; if ( ! gem_dialog ) { gem_title = XmStringCreateLocalized( "Observed Sounding Selection" ); gem_dialog = XmCreateBulletinBoardDialog(toplevel, "gem_panel", NULL, 0); XtVaSetValues( gem_dialog, XmNdialogTitle, gem_title, NULL); /* XmStringFree(gem_title); */ gempane = XtVaCreateManagedWidget("parcel_pane", xmPanedWindowWidgetClass, gem_dialog, XmNsashWidth, 1, XmNsashHeight, 1, NULL); gemform = XtVaCreateWidget("form", xmFormWidgetClass, gempane, XmNfractionBase, 8, NULL ); str = XmStringCreateLocalized ("GEMPAK sounding file:"); gemfile_label = XtVaCreateManagedWidget ("gemfile_label", xmLabelWidgetClass, gemform, XmNlabelString, str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, NULL ); /* XmStringFree (str); */ rc = XtVaCreateWidget ("rowcol", xmRowColumnWidgetClass, gemform, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 8, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4, XmNentryAlignment, XmALIGNMENT_END, XmNpacking, XmPACK_COLUMN, XmNorientation, XmHORIZONTAL, NULL ); xsection_lbl = XmStringCreateLocalized ("Timesection Height(Ft):"); num = XtNumber(levellist); levels_str = (XmString *)XtMalloc( num * sizeof(XmString)); for (i=0; i < num; i++) levels_str[i] = XmStringCreateLocalized(levellist[i]); xsection_hght = XmVaCreateSimpleOptionMenu (rc, "option_menu", xsection_lbl, 'S', 8, xsection_hght_cb, XmVaPUSHBUTTON, levels_str[0], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[1], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[2], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[3], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[4], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[5], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[6], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[7], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[8], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[9], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[10], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[11], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[12], NULL, NULL, NULL, NULL ); XtManageChild(xsection_hght); /* for (i=0; i < num; i++) XmStringFree ( levels_str[i] ); */ XtManageChild(rc); gemfile_text = XtVaCreateManagedWidget ("gemtext", xmTextFieldWidgetClass, gemform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, rc, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 3, NULL ); XtAddCallback ( gemfile_text, XmNactivateCallback, get_gemfile_text, NULL ); gemfile_load = XtVaCreateManagedWidget ("Change File", xmPushButtonWidgetClass, gemform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 3, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, rc, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL ); XtAddCallback ( gemfile_load, XmNactivateCallback, load_gemfile, NULL ); raob_btn = XtVaCreateManagedWidget ("RAOB", xmPushButtonWidgetClass, gemform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, rc, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 5, NULL ); XtAddCallback ( raob_btn, XmNactivateCallback, set_gempak_file, (XtPointer)0 ); tamdar_btn = XtVaCreateManagedWidget ("TAMDAR", xmPushButtonWidgetClass, gemform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 5, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, rc, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 6, NULL ); XtAddCallback ( tamdar_btn, XmNactivateCallback, set_gempak_file, (XtPointer)1 ); prof_btn = XtVaCreateManagedWidget ("PROFILER", xmPushButtonWidgetClass, gemform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 6, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, rc, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 7, NULL ); XtAddCallback ( prof_btn, XmNactivateCallback, set_gempak_file, (XtPointer)2 ); vad_btn = XtVaCreateManagedWidget ("VADWIND", xmPushButtonWidgetClass, gemform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 7, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, rc, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 8, NULL ); XtAddCallback ( vad_btn, XmNactivateCallback, set_gempak_file, (XtPointer)3 ); str = XmStringCreateLocalized ("Sounding times:"); gemlbl_time = XtVaCreateManagedWidget ("gemfile_time", xmLabelWidgetClass, gemform, XmNlabelString, str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 1, XmNalignment, XmALIGNMENT_BEGINNING, XmNbottomPosition, 2, NULL ); /* XmStringFree (str); */ gemfile_timelist = XmCreateScrolledList ( gemform, "gemtimes", NULL, 0 ); XtVaSetValues ( gemfile_timelist, XmNvisibleItemCount, 14, NULL ); XtVaSetValues (XtParent(gemfile_timelist), XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, gemfile_text, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, NULL ); XtAddCallback ( gemfile_timelist, XmNbrowseSelectionCallback, time_select_cb, NULL ); XtManageChild ( gemfile_timelist ); gemlbl_station = XtVaCreateManagedWidget("map", xmDrawingAreaWidgetClass, gemform, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, gemfile_text, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, XtParent(gemfile_timelist), XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNwidth, 560, XmNbackground, pixels[0], NULL); XtAddCallback( gemlbl_station, XmNexposeCallback, mapw_exposeCb, NULL ); /* plotData.mode = STNSELECT;*/ XtAddEventHandler( gemlbl_station, ButtonPressMask, FALSE, mapw_pickstnCb, NULL ); XtManageChild ( gemform ); gemform2 = XtVaCreateWidget("form", xmFormWidgetClass, gempane, XmNfractionBase, 10, XmNwidth, 980, XmNheight, 60, NULL ); gemfile_cancel = XtVaCreateManagedWidget ("CANCEL", xmPushButtonWidgetClass, gemform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 1, NULL ); XtAddCallback(gemfile_cancel, XmNactivateCallback, (XtCallbackProc)gem_info_cancel_cb, NULL); gemfile_world = XtVaCreateManagedWidget ("WORLD", xmPushButtonWidgetClass, gemform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 1, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 5, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, NULL ); XtAddCallback(gemfile_world, XmNactivateCallback, (XtCallbackProc)gem_info_world_cb,NULL); gemfile_US = XtVaCreateManagedWidget ("U.S.", xmPushButtonWidgetClass, gemform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 1, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 5, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, NULL ); XtAddCallback(gemfile_US, XmNactivateCallback, (XtCallbackProc)gem_info_US_cb,NULL); gemfile_TROP_SFC = XtVaCreateManagedWidget("TROPSFC", xmPushButtonWidgetClass, gemform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 2, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 5, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 3, NULL ); XtAddCallback(gemfile_TROP_SFC, XmNactivateCallback, (XtCallbackProc)gem_info_TROP_SFC_cb,NULL); gemfile_OFAGX = XtVaCreateManagedWidget("OFAGX", xmPushButtonWidgetClass, gemform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 3, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 5, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL ); XtAddCallback(gemfile_OFAGX, XmNactivateCallback, (XtCallbackProc)gem_info_OFAGX_cb,NULL); gemfile_ATL = XtVaCreateManagedWidget("ATLANTIC", xmPushButtonWidgetClass, gemform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 2, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 5, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 3, NULL ); XtAddCallback(gemfile_ATL, XmNactivateCallback, (XtCallbackProc)gem_info_ATL_cb, NULL); gemfile_PAC = XtVaCreateManagedWidget("PACIFIC", xmPushButtonWidgetClass, gemform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 3, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 5, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL ); XtAddCallback(gemfile_PAC, XmNactivateCallback, (XtCallbackProc)gem_info_PAC_cb, NULL); gemfile_stabmap= XtVaCreateManagedWidget("STBLTY\nMAP", xmPushButtonWidgetClass, gemform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 5, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 6, NULL ); XtAddCallback(gemfile_stabmap, XmNactivateCallback, (XtCallbackProc)gem_info_STABMAP_cb,NULL); gemfile_icemap = XtVaCreateManagedWidget("ICEMAP", xmPushButtonWidgetClass, gemform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 6, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 7, NULL ); XtAddCallback(gemfile_icemap, XmNactivateCallback, (XtCallbackProc)gem_info_ICEMAP_cb,NULL); gemfile_zoom = XtVaCreateManagedWidget("ZOOM", xmPushButtonWidgetClass, gemform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 7, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 8, NULL ); XtAddCallback(gemfile_zoom, XmNactivateCallback, (XtCallbackProc)gem_info_zoom_cb, NULL); gemfile_unzoom = XtVaCreateManagedWidget("UNZOOM", xmPushButtonWidgetClass, gemform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 8, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 9, NULL ); XtAddCallback(gemfile_unzoom, XmNactivateCallback, (XtCallbackProc)gem_info_unzoom_cb, NULL); gemfile_help = XtVaCreateManagedWidget ("HELP", xmPushButtonWidgetClass, gemform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 9, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 10, NULL ); XtManageChild ( gemform2 ); XtManageChild ( gempane ); XtManageChild ( gem_dialog ); mapw_rgstr( gemlbl_station ); if ( redisplay == 0 ) { XtAddCallback( gemlbl_station, XmNresizeCallback, mapw_resizeCb, NULL ); } XtVaGetValues ( gemfile_text, XmNvalue, &gemouttext, NULL ); /* * Parse out the three different sounding default files */ gemsoundfile[0] = '\0'; strp = strtok ( gemouttext, "+" ); if ( strp ) { strcpy ( gemsoundraob, strp ); strp = strtok ( '\0', "+" ); if ( strp ) { strcpy ( gemsoundtamdar, strp ); strp = strtok ( '\0', "+" ); if ( strp ) { strcpy ( gemsoundprof, strp ); strp = strtok ( '\0', "+" ); if ( strp ) { strcpy ( gemsoundvad, strp ); } } } } if ( mode != 3 ) { if ( strlen(gemsoundraob) == 0 ) gemsoundfile[0] = '\0'; else strcpy ( gemsoundfile, gemsoundraob ); gemfile_times (); if ( gemsoundfile[0] != '\0' ) { gemfile_times (); } else { XmListDeselectAllItems (gemfile_timelist); XtVaSetValues ( gemfile_timelist, XmNitemCount, 0, XmNitems, str_list, NULL ); } Load_stationlist ( 0 ); } #ifndef LESSTIF_VERSION XtFree ( gemouttext ); #endif XtVaSetValues ( gemfile_text, XmNvalue, gemsoundfile, NULL ); } else { if ( mode != 3 && redisplay == 0 ) { if ( strcmp ( gemsoundraob, gemsoundfile ) != 0 ) { XmListDeselectAllItems (gemfile_timelist); XtVaSetValues ( gemfile_timelist, XmNitemCount, 0, XmNitems, str_list, NULL ); } if ( strlen(gemsoundraob) == 0 ) gemsoundfile[0] = '\0'; else strcpy ( gemsoundfile, gemsoundraob ); gemfile_times (); if ( gemsoundfile[0] != '\0' ) { gemfile_times (); } else { XmListDeselectAllItems (gemfile_timelist); XtVaSetValues ( gemfile_timelist, XmNitemCount, 0, XmNitems, str_list, NULL ); } if ( mode == 1 && redisplay == 0 ) { resize_callback ( draw_reg, (XtPointer)NULL, (XtPointer)NULL ); } } else { if ( redisplay == 0 ) { gemsoundfile[0] = '\0'; XmListDeselectAllItems (gemfile_timelist); XtVaSetValues ( gemfile_timelist, XmNitemCount, 0, XmNitems, str_list, NULL ); } } XtVaSetValues ( gemfile_text, XmNvalue, gemsoundfile, NULL ); } strcpy ( gemdevice, "maptop" ); gslwin(gemdevice, &iret, strlen(gemdevice)); XtManageChild ( gem_dialog ); } /*NP*/ void show_profiler_vad_info(Widget w) /***************************************************/ /* SHOW_PROFILER_VAD_INFO (LJH) */ /***************************************************/ { static Widget pvform, pvform2, pvfile_label,pvfile_cancel,pvpane,pv_exit,pv_update,rc; XmString str,pv_title, *levels_str, psection_lbl; XmStringTable str_list = NULL; char *gemouttext, gemdevice[72],proffile_work[200]; char *proffile; char *strp; int i, ncnt, num, iret; char *file_dir, file[200]; char *str_type[20]; XrmValue value; if ( ! pv_dialog ) { pv_title= XmStringCreateLocalized("Profiler/Vad Selection"); pv_dialog=XmCreateBulletinBoardDialog(toplevel, "pv_panel", NULL, 0); XtVaSetValues( pv_dialog, XmNdialogTitle, pv_title, NULL); /* XmStringFree(pv_title); */ pvpane = XtVaCreateManagedWidget("profiler_vad_pane", xmPanedWindowWidgetClass, pv_dialog, XmNsashWidth, 1, XmNsashHeight, 1, NULL); pvform=XtVaCreateWidget("form",xmFormWidgetClass, pvpane, XmNfractionBase, 10, XmNheight, pvs_HGHT+70, XmNwidth, pvs_WDTH+VP_WDTH+115, NULL); /* Change 7 to 10 */ str=XmStringCreateLocalized("Profiler file:"); pvfile_label = XtVaCreateManagedWidget ("pvfile_label", xmLabelWidgetClass, pvform, XmNlabelString, str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 1, NULL ); /* XmStringFree(str); */ rc = XtVaCreateWidget ("rowcol", xmRowColumnWidgetClass, pvform, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 7, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4, XmNentryAlignment, XmALIGNMENT_END, XmNpacking, XmPACK_COLUMN, XmNorientation, XmHORIZONTAL, NULL ); psection_lbl = XmStringCreateLocalized ("Plane section Height(Ft):"); num = XtNumber(levellist); levels_str = (XmString *)XtMalloc( num * sizeof(XmString)); for (i=0; i < num; i++) levels_str[i] = XmStringCreateLocalized(levellist[i]); psection_hght = XmVaCreateSimpleOptionMenu (rc, "option_menu", psection_lbl, 'S', 1, psection_hght_cb, XmVaPUSHBUTTON, levels_str[0], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[1], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[2], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[3], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[4], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[5], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[6], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[7], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[8], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[9], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[10], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[11], NULL, NULL, NULL, XmVaPUSHBUTTON, levels_str[12], NULL, NULL, NULL, NULL ); XtManageChild(psection_hght); /* for (i=0; i < num; i++) XmStringFree ( levels_str[i] ); */ XtManageChild(rc); /* */ if (XrmGetResource(g_applicationDB,"sharp95*pvfile_timelist.profiler", "Sharp95*pvfile_timelist.profiler",str_type,&value) == True) { strncpy(g_proffile,value.addr,(int) value.size); } else g_proffile[0] = '\0'; if (XrmGetResource(g_applicationDB,"sharp95*pvfile_timelist.vad", "Sharp95*pvfile_timelist.vad",str_type,&value) == True) { strncpy(g_vadfile,value.addr,(int) value.size); } else g_vadfile[0] = '\0'; pvfile_timelist = XmCreateScrolledList (pvform, "pvtimes", NULL, 0); XtVaSetValues (pvfile_timelist, XmNvisibleItemCount, 15, NULL); XtVaSetValues (XtParent(pvfile_timelist), XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, pvfile_label, /*XmNtopPosition, 0,*/ XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 1, NULL ); XtAddCallback( pvfile_timelist, XmNbrowseSelectionCallback, pv_select_cb, NULL); /* pv_station=XtVaCreateManagedWidget("map4", xmDrawingAreaWidgetClass, pvform, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, psection_hght, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, XtParent(pvfile_timelist), XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNheight, 800, XmNwidth, 1024, XmNbackground, pixels[0], NULL); */ pv_station=XtVaCreateManagedWidget("map4", xmDrawingAreaWidgetClass, pvform, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, psection_hght, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, XtParent(pvfile_timelist), XmNbottomAttachment, XmATTACH_FORM, XmNheight, pvs_HGHT, XmNwidth, pvs_WDTH, XmNbackground, pixels[0], NULL); pvform2 = XtVaCreateWidget("form", xmFormWidgetClass, pvpane, XmNfractionBase, 10, NULL); /* Change 7 to 10 */ pv_vertprof=XtVaCreateManagedWidget("pvvert", xmDrawingAreaWidgetClass, pvform, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, psection_hght, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, pv_station, XmNrightAttachment, XmATTACH_FORM, /* XmNbottomAttachment, XmATTACH_FORM,*/ XmNheight, VP_HGHT, XmNwidth, VP_WDTH, XmNbackground, pixels[0], NULL); pv_hodo=XtVaCreateManagedWidget("pvhodo", xmDrawingAreaWidgetClass, pvform, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, pv_vertprof, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, pv_station, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNheight, HODO_HGHT, XmNwidth, HODO_WDTH, XmNbackground, pixels[0], NULL); pv_exit = XtVaCreateManagedWidget ("EXIT", xmPushButtonWidgetClass, pvform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 1, NULL ); XtAddCallback(pv_exit, XmNactivateCallback, (XtCallbackProc)pv_info_exit_cb, NULL); pv_update = XtVaCreateManagedWidget ("UPDATE", xmPushButtonWidgetClass, pvform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 1, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, NULL ); XtAddCallback(pv_update, XmNactivateCallback, (XtCallbackProc)pv_info_update_cb,NULL); iret=UpdateTimeList(); XtManageChild (pvfile_timelist); XtManageChild (pvform); XtManageChild (pvform2); XtManageChild (pvpane); XtManageChild (pv_dialog); pv_station_mapw_rgstr(pv_station); XtManageChild (pv_vertprof); InitSaveVertProfBg(pv_vertprof); /* InitSaveHodoBg(pv_hodo); */ } else { iret=UpdateTimeList(pv_vertprof); XtManageChild (pv_dialog); } if (iret == 0) { /*Get Latest Data*/ XmListSelectPos(pvfile_timelist, 1, True); } XtAddEventHandler (pv_station, PointerMotionMask, FALSE, (XtEventHandler) GetInterpPVSounding, (XtPointer) NULL); } /*NP*/ /*****************************************************************/ /* GETINTERPPVSOUNDING (LJH) */ /* Interpolates profiler/vad soundings at cursor location */ /*****************************************************************/ void GetInterpPVSounding(Widget mapwin, XtPointer client_data,XEvent *event) { char sysin[3],sysout[3],cursor_pos[81]; float xdev,ydev,lat,lon; int iret,np=1,i; xdev = (float) event->xbutton.x; ydev = (float) event->xbutton.y; strcpy ( sysin, "D" ); strcpy ( sysout, "M" ); gtrans(sysin, sysout, &np, &xdev, &ydev, &lat, &lon, &iret, strlen(sysin), strlen(sysout)); cursor_pos[0] = '\0'; sprintf(cursor_pos,"%6.2f,%7.2f\0",lat,lon); GetWindProfAtCurs((int)xdev,(int)ydev,nsta, staxywrk, levelshodo, vawndwrk, wnddirs,wndspds,wndhts,&wndcnt,38,250,g_LNGC,39.0); if (wndcnt>0) { InitProfWindow(pv_vertprof); DrawPVVertWinds(wndcnt,wnddirs,wndspds,wndhts,pv_vertprof); DrawPVHodograph(wndcnt,wnddirs,wndspds,wndhts,pv_hodo); } } /*NP*/ /*****************************************************************/ /* UPDATETIMELIST (LJH) */ /* Time list for profiler/vad soundings */ /*****************************************************************/ int UpdateTimeList() { int iret,i,ncnt; XmStringTable str_list = NULL; char proffile[200]; char *file_dir; /* The following 2-lines are commented out due to Profiler Outage starting Oct. 1, 2008 for 3-5 weeks. */ /* sprintf(gemsoundfile,"%s",g_proffile); get_gem_times (g_proffile,time_list,&ntimes,&iret,strlen(g_proffile)); */ sprintf(gemsoundfile,"%s",g_vadfile); get_gem_times (g_vadfile,time_list,&ntimes,&iret,strlen(g_vadfile)); if (iret == 0) { str_list = (XmStringTable) XtMalloc(ntimes * sizeof (XmString)); for (i = ntimes-1;i>=0;i--) { time_list[i][11] = 0; str_list[ntimes-1-i] = XmStringCreateLocalized(time_list[i]); } XtVaGetValues (pvfile_timelist, XmNitemCount, &ncnt, NULL); XtVaSetValues (pvfile_timelist, XmNitemCount, ntimes, XmNitems, str_list, NULL); for (i=0; i < ntimes; i++ ) XmStringFree ((XmString)str_list[i]); XtFree((char *)str_list); } return iret; } /*NP*/ /******************************************************************/ /* PV_INFO_EXIT_CB (LJH) */ /******************************************************************/ void pv_info_exit_cb(Widget w) { XtRemoveTimeOut(g_pv_timer); g_pv_timersw=0; ExitWindowSystem(); XtUnmanageChild (pv_dialog); } /*NP*/ /******************************************************************/ /* PV_INFO_UPDATE_CB (LJH) */ /******************************************************************/ void pv_info_update_cb(Widget w) { int iret; iret=UpdateTimeList(); XtRemoveTimeOut(g_pv_timer); g_pv_timersw=0; XmListSelectPos(pvfile_timelist,1,True); } /*NP*/ /******************************************************************/ /* PV_STATION_MAPW_RGSTR (LJH) */ /******************************************************************/ pv_station_mapw_rgstr(mapwin) Widget mapwin; { XColor cred; Dimension wdth, hght; Cursor curs; int xwdth, xhght, xdpth; int iret, mapindx=0; char gemdevice[72]; /*---------------------------------------------------------------------*/ /* * Get the map window geometry. */ XtVaGetValues(mapwin, XmNwidth, &wdth, XmNheight, &hght, NULL); xwdth = (int)wdth; xhght = (int)hght; xdpth = DefaultDepthOfScreen(XtScreen(mapwin)); /* * Set the window and graphics context. */ g_display = XtDisplay(mapwin); g_window = XtWindow(mapwin); g_gc = XCreateGC(gemdisplay, g_window, 0, 0); /* * Create a red arrow for the cursor. */ curs = XCreateFontCursor(gemdisplay, XC_top_left_arrow); XDefineCursor(gemdisplay, g_window, curs); cred.red = 65535; cred.blue = 0; cred.green = 0; cred.flags = DoRed | DoBlue | DoGreen; XRecolorCursor(gemdisplay, curs, &cred, &cred); /* * Set the fill rule. */ XSetFillRule(gemdisplay, g_gc, WindingRule); /* * Register the map window */ strcpy(gemdevice,"maptoppv"); xmotifw(g_window, gemdevice, g_gc, xwdth, xhght, xdpth, &iret); if( iret != 0 ) return( iret ); /* * Draw the US map. FORTRAN function map_init() */ map_init(&iret, gemdevice, strlen(gemdevice)); strcpy ( map_info[0].name, "US" ); strcpy ( map_info[0].proj, "STR/90;-105;0/nm" ); g_LNGC=-105.0; /* Centering Longitude -- Affects Windbarbs */ strcpy ( map_info[0].garea, "22.88;-120.49;46.02;-60.83" ); mapb.x[0] = 22.88;mapb.x[1]=46.02; mapb.y[0] = -120.49;mapb.y[1]=-60.83; mapindx = 0; draw_map(mapindx, map_info, 0, &mapb, &iret); return( 0 ); } /*NP*/ /*********************************************************************/ /* EXPOSE_PVMAP_STATION_OVERLAYS */ /*********************************************************************/ void expose_pvmap_station_overlays(Widget w, XmDrawingAreaCallbackStruct *call_data) { XCopyArea(XtDisplay(pv_station), pv_window, XtWindow(pv_station), g_gc, 0, 0, pvs_WDTH, pvs_HGHT, 0, 0); XFlush(XtDisplay(pv_station)); } /*NP*/ /**********************************************************************/ /* RESIZE_PVMAP_STATION_OVERLAYS */ /**********************************************************************/ void resize_pvmap_station_overlays(Widget w, XmDrawingAreaCallbackStruct *call_data) { XCopyArea(XtDisplay(pv_station), pv_window, XtWindow(pv_station), g_gc, 0, 0, pvs_WDTH, pvs_HGHT, 0, 0); XFlush(XtDisplay(pv_station)); } /*NP*/ void load_gemfile ( Widget w, XtPointer client_data, XtPointer call_data ) /*************************************************************/ /* LOAD_GEMFILE */ /*************************************************************/ { static Widget load_filegem; if ( ! load_filegem ) { load_filegem = XmCreateFileSelectionDialog ( toplevel, "obssndg_sel", NULL, 0 ); XtAddCallback ( load_filegem, XmNokCallback, get_gemfile, NULL ); XtAddCallback ( load_filegem, XmNcancelCallback, (XtCallbackProc)XtUnmanageChild, NULL ); XtAddCallback ( load_filegem, XmNokCallback, (XtCallbackProc)XtUnmanageChild, NULL ); } XtManageChild(load_filegem); } /*NP*/ void get_gemfile_text ( Widget w, XtPointer client_data, XtPointer call_data ) /*************************************************************/ /* GET_GEMFILE_TEXT */ /*************************************************************/ { char *filename = (char *) XmTextFieldGetString (w); int i, ncnt, mapindx = 0, iret; XmStringTable str_list = NULL; strcpy ( gemsoundfile, filename ); draw_map(mapindx, map_info, 0, &mapb, &iret); if ( strlen(filename) != 0 ) { gemfile_times(); } else { XmListDeselectAllItems (gemfile_timelist); XtVaSetValues ( gemfile_timelist, XmNitemCount, 0, XmNitems, str_list, NULL ); gemsoundfile[0] = '\0'; } } /*NP*/ void get_gemfile ( Widget w, XtPointer client_data, XtPointer call_data ) /*************************************************************/ /* GET_GEMFILE */ /*************************************************************/ { char *file = NULL, filename[200]; XmFileSelectionBoxCallbackStruct *cbs = (XmFileSelectionBoxCallbackStruct *) call_data; XmStringTable str_list; int i, ncnt, iret; if (cbs) { if ( !XmStringGetLtoR (cbs->value, XmFONTLIST_DEFAULT_TAG, &file) ) return; XtVaSetValues ( gemfile_text, XmNvalue, file, NULL ); strcpy ( gemsoundfile, file ); gemfile_times(); } } /*NP*/ void stationlist_cb (Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* STATIONLIST_CB */ /*************************************************************/ { int item_no = (int) client_data; Load_stationlist ( item_no ); } /*NP*/ void Load_stationlist (int list) /*************************************************************/ /* LOAD_STATIONLIST */ /*************************************************************/ { XmStringTable str_list; /*char station_table[200], staid[4000][5], staname[30], idsta[5], station_tbl[12], sta_st[3], sta_coun[3], statlist[4000][18];*/ char *tbl_dir; int stnm[4000], sta_elv, sta_pri, i, j; /*int nsta, ncolor, mrktyp, mrkwid, pltval, iposn, jcolr;*/ int iret, mapindx=0; /*float sta_lat[4000], sta_lon[4000], sizmrk;*/ FILE *fp; /*struct maptype_list map_info[2]; mapbnd_t mapb;*/ Window gwin; static stationlistSW=0; char gemdevice[72]; int xwdth, xhght, xdpth; Dimension wdth,hght; station_tbl[0] = '\0'; switch ( list ) { case 0: strcpy ( station_tbl, "US" ); break; case 1: strcpy ( station_tbl, "CN" ); break; case 2: strcpy ( station_tbl, "MX" ); break; } if (! stationlistSW) { strcpy ( map_info[0].name, "US" ); strcpy ( map_info[0].proj, "STR/90;-105;0/nm" ); strcpy ( map_info[0].garea, "22.88;-120.49;46.02;-60.83" ); mapb.x[0] = 22.88;mapb.x[1]=46.02; mapb.y[0] = -120.49;mapb.y[1]=-60.83; stationlistSW=-1; } else sprintf(map_info[0].garea,"%3.0f;%5.0f;%3.0f;%5.0f",mapb.x[0], mapb.y[0],mapb.x[1],mapb.y[1]); mapindx = 0; station_list = list; if ( gemsoundfile[0] != '\0' && gemsoundtime[0] != '\0' && station_tbl[0] != '\0' ) { get_gem_stns ( gemsoundfile, station_tbl, gemsoundtime, statlist, &nsta, sta_lat, sta_lon, sta_elev, &item_type, strlen (gemsoundfile), strlen (station_tbl), strlen (gemsoundtime)); ncolor = 1; mrktyp = 6; sizmrk = 1.0; mrkwid = 2; pltval = G_FALSE; iposn = 0; jcolr = 2; markSW=-1; strcpy ( gemdevice, "maptop" ); gslwin(gemdevice, &iret, strlen(gemdevice)); map_init(&iret, gemdevice, strlen(gemdevice)); draw_map(mapindx, map_info, 1, &mapb, &iret); map_mark ( &nsta, sta_lat, sta_lon, NULL, &ncolor, NULL, &jcolr, &mrktyp, &sizmrk, &mrkwid, &pltval, &iposn, &iret ); plotData.mode = STNSELECT; 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]; stnList.elv[i] = sta_elev[i]; strcpy ( stnList.stnName[i], statlist[i] ); } } else { stnList.nstn = 0; strcpy ( gemdevice, "maptop" ); gslwin(gemdevice, &iret, strlen(gemdevice)); map_init(&iret, gemdevice, strlen(gemdevice)); /* gclear(&iret); */ draw_map(mapindx, map_info, 0, &mapb, &iret); } gemsoundsta[0] = '\0'; } void Load_PFS_stationlist(int list) { char *tbl_dir; int stnm[4000], sta_elv, sta_pri, i, j; /*int nsta, ncolor, mrktyp, mrkwid, pltval, iposn, jcolr;*/ int iret, mapindx=0; /*float sta_lat[4000], sta_lon[4000], sizmrk;*/ FILE *fp; /*struct maptype_list map_info[2]; mapbnd_t mapb;*/ Window gwin; static stationlistSW=0; char gemdevice[72]; int xwdth, xhght, xdpth; Dimension wdth,hght; char gemmodelstring[80]; station_tbl[0] = '\0'; char *mdlouttext; /* Activate Hour-glass on wait to get station listing */ Display *display; Cursor cursor=(Cursor) None; display=XtDisplay(gemlbl_station3); gwin=XtWindow(gemlbl_station3); cursor=XCreateFontCursor(display,XC_watch); XDefineCursor(display,gwin,cursor); display=XtDisplay(pfs_mdl_dialog); gwin=XtWindow(pfs_mdl_dialog); cursor=XCreateFontCursor(display,XC_watch); XDefineCursor(display,gwin,cursor); XFlush(XtDisplay(pfs_mdl_dialog)); /************/ switch ( list ) { case 0: strcpy ( station_tbl, "US" ); break; case 1: strcpy ( station_tbl, "CN" ); break; case 2: strcpy ( station_tbl, "MX" ); break; case -1: strcpy ( station_tbl, "US"); stationlistSW=-1; break; } if (! stationlistSW) { strcpy ( map_info[0].name, "US" ); strcpy ( map_info[0].proj, "STR/90;-105;0/nm" ); strcpy ( map_info[0].garea, "22.88;-120.49;46.02;-60.83" ); mapb.x[0] = 22.88;mapb.x[1]=46.02; mapb.y[0] = -120.49;mapb.y[1]=-60.83; stationlistSW=-1; } else sprintf(map_info[0].garea,"%3.0f;%5.0f;%3.0f;%5.0f",mapb.x[0], mapb.y[0],mapb.x[1],mapb.y[1]); mapindx = 0; station_list = list; sprintf(gemmodelstring,"%s/%s",g_pfs_pathname,g_pfs_mdlsoundfile); item_type=1; get_gem_stns(gemmodelstring,station_tbl,g_msoundtimes[0], statlist,&nsta,sta_lat,sta_lon,sta_elev, &item_type, strlen(gemmodelstring),strlen(station_tbl), strlen(g_msoundtimes[0])); ncolor = 1; mrktyp = 6; sizmrk = 1.0; mrkwid = 2; pltval = G_FALSE; iposn = 0; jcolr = 2; markSW=-1; strcpy ( gemdevice, "maptop3" ); gslwin(gemdevice, &iret, strlen(gemdevice)); map_init(&iret, gemdevice, strlen(gemdevice)); draw_map(mapindx, map_info, 1, &mapb, &iret); map_mark ( &nsta, sta_lat, sta_lon, NULL, &ncolor, NULL, &jcolr, &mrktyp, &sizmrk, &mrkwid, &pltval, &iposn, &iret ); plotData.mode = STNSELECT; 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]; stnList.elv[i] = sta_elev[i]; strcpy ( stnList.stnName[i], statlist[i] ); } NuiDefaultCursor(gemlbl_station3); NuiDefaultCursor(pfs_mdl_dialog); } /*NP*/ void sta_select_cb (int which_sta ) /*************************************************************/ /* STA_SELECT_CB */ /*************************************************************/ { char stanum[6], sta_tmp[12]; int ival; g_mlocationSelected=-1; ival = sscanf ( stnList.stnName[which_sta], "%s %s %s", sta_id, stanum, sta_tmp ); gemsoundsta[0] = 0; if ( ival == 2 ) { if ( mode == 3 ) { strcpy ( gemsoundsta, "@" ); strcat ( gemsoundsta, sta_id ); } else { strcpy ( gemsoundsta, "@" ); strcat ( gemsoundsta, stanum ); } } else if ( ival == 1 ) { strcpy ( gemsoundsta, "@" ); strcat ( gemsoundsta, sta_id ); } /* LJH added to correct temp=dwpt problem */ /* Event Handler is re-enabled in function:position_cursor() */ XtRemoveEventHandler( draw_reg, ButtonReleaseMask, FALSE, (XtEventHandler)redraw_sounding, (XtPointer)NULL); if (g_pfs_model_sel_sw) { ival=1; strcpy ( gemsoundsta, "@" ); strcat ( gemsoundsta, sta_id ); sprintf( gemsoundfile,"%s/%s",g_pfs_pathname,g_pfs_mdlsoundfile); strcpy( gemsoundtime,g_msoundtimes[0]); Load_pfs_mdl_sounding(); } else { Load_gem_sounding (); } } void Load_pfs_mdl_sounding () { Widget mapwin; Window gwin; GC gemgc; Display *display; int xwdth, xhght, xdpth; int newlev = 0; float ix1, ix2; int i,j,k,i1; char gemdevice[80],timestring[80]; char buf[80]; char gemlatlonstr[25]; int iret; Cursor cursor=(Cursor) None; display=XtDisplay(gemlbl_station3); gwin=XtWindow(gemlbl_station3); cursor=XCreateFontCursor(display,XC_watch); XDefineCursor(display,gwin,cursor); display=XtDisplay(pfs_mdl_dialog); gwin=XtWindow(pfs_mdl_dialog); cursor=XCreateFontCursor(display,XC_watch); XDefineCursor(display,gwin,cursor); display=XtDisplay(draw_reg); gwin=XtWindow(draw_reg); cursor=XCreateFontCursor(display,XC_watch); XDefineCursor(display,gwin,cursor); XFlush(XtDisplay(pfs_mdl_dialog)); if (numlvl > 0) copy_sndg(); sndg2[0][0]=numlvl; for (i=0;i0) sprintf(gemlatlonstr,"%4.1fN %5.1fW",g_lat,-g_lng); else if (g_lng>0 && g_lat>0) sprintf(gemlatlonstr,"%4.1fN %5.1fE",g_lat,g_lng); else if (g_lng<0 && g_lat<0) sprintf(gemlatlonstr,"%4.1fS %5.1fW",-g_lat,-g_lng); else sprintf(gemlatlonstr,"%4.1fS %5.1fE",-g_lat,g_lng); sprintf ( raobtitle, " %s %s %s ", mdl_selected, g_msoundtimes[i], gemlatlonstr); sprintf(raob_type, "Model Point Forecast for %s Elev=%5.0f ft",sta_id, g_elev * 3.28 ); xtnd_sndg(); save_origsndg (); resize_callback ( draw_reg, (XtPointer)NULL, (XtPointer)NULL ); if (numlvl > 2) { pagenum = 1; define_parcel( current_parcel, user_level ); mean_wind( -1, -1, &ix1, &ix2, &st_dir, &st_spd); st_spd *= .75; show_parcel (); show_page( pagenum ); } strcpy(buf,"LOADING...PLEASE WAIT"); XDrawString(XtDisplay(time_oper_reg),XtWindow(time_oper_reg),gc3,1,24,buf,strlen(buf)); XFlush(XtDisplay(pfs_mdl_dialog)); XFlush(XtDisplay(time_oper_reg)); XFlush(XtDisplay(draw_reg)); } g_act_sndg=0; XCopyArea(XtDisplay(time_oper_reg),time_oper_window, XtWindow(time_oper_reg), gc3, 0, 0, 140,40,0,0); LoadSingleModelSounding(g_act_sndg); NuiDefaultCursor(gemlbl_station3); NuiDefaultCursor(pfs_mdl_dialog); NuiDefaultCursor(draw_reg); } /*NP*/ /********************************************************************/ /* PV_SELECT_CB (LJH) */ /********************************************************************/ void pv_select_cb (Widget w, XtPointer client_data, XtPointer call_data) { int i, j, iret, mapindx=0; XmListCallbackStruct* cbs = (XmListCallbackStruct*) call_data; char*choice; char gemtimes[80]; static char datestring[80]; char stations[800]; char stationswrk[800]; Window gwin; GC gemgc; int xwdth, xhght, xdpth; char gemdevice[72]; /* pvsounding... up to 100 levels, 3 parameters (z,dd,ff), 200 stations */ float pvsndgblk[200][300]; /* pvnlvls... Track nlvls for each station */ int pvnlvls[200], pvnstns; Dimension wdth,hght; float lat,lon,xloc,yloc; char sys1[2],sys2[2]; int dir,speed; int np=1; char gemyaxis[72]; int offset, offset2, nstawrk; char proffile2[200]; int ntimes2; char *file_dir; char *ptr; int index; unsigned levels[14]={0,3000,5000,8000,10000,12000,15000,18000, 20000,25000,30000,40000,50000,60000}; Cursor cursor=(Cursor) None; cursor=XCreateFontCursor(g_display,XC_watch); XDefineCursor(g_display,g_window,cursor); XmStringGetLtoR(cbs->item,XmFONTLIST_DEFAULT_TAG, &choice); if (choice != '\0') { sprintf(datestring,"%s",choice); } XtFree(choice); sprintf(gemsoundtime,"%s",datestring); /*need gemsoundsta */ station_tbl[0] = '\0'; strcpy( station_tbl, "US" ); item_type=2; XtVaGetValues(pv_station, XmNwidth, &wdth, XmNheight, &hght, NULL); xwdth = (int)wdth; xhght = (int)hght; xmotifw(g_window, "maptoppv", g_gc, xwdth, xhght, xdpth, &iret); /* sprintf(gemsoundfile,"$OBS/upperair/profdata.snd"); */ sprintf(gemsoundfile,g_proffile); get_gem_stns (gemsoundfile,station_tbl,gemsoundtime, statlist, &nsta, sta_lat, sta_lon, sta_elev, &item_type, strlen (gemsoundfile), strlen (station_tbl), strlen (gemsoundtime)); stations[0]='\0'; for ( i=0; i < nsta; i++ ) { statlist[i][17] = 0; if (i>0) strcat(stations,";"); strncat(stations,statlist[i],3); } /* initialize pvsndgblk */ for (i=0;i<200;i++) for (j=0;j<300;j++) pvsndgblk[i][j]=0.0; /* Process not more than 20 stations at a time */ nstawrk=nsta; offset=0; while (nstawrk>20) { strncpy(stationswrk,stations+offset*4,20*4); stationswrk[79]='\0'; get_pvsoundings (gemsoundfile, gemsoundtime, stationswrk, pvsndgblk, pvnlvls, &pvnstns, &offset, strlen(gemsoundfile), strlen(gemsoundtime), strlen(stationswrk)); offset+=20; nstawrk-=20; }; strncpy(stationswrk,stations+offset*4,nstawrk*4); stationswrk[nstawrk*4]='\0'; get_pvsoundings (gemsoundfile, gemsoundtime, stationswrk, pvsndgblk, pvnlvls, &pvnstns, &offset, strlen(gemsoundfile), strlen(gemsoundtime), strlen(stationswrk)); g_nprofstns=nsta; for (i=0;i0) strcat(stations,";"); strncat(stations,statlist[i],3); }; g_nvadstns=nsta; for (j=0;j20) { strncpy(stationswrk,stations+offset2*4,20*4); stationswrk[79]='\0'; get_pvsoundings (proffile2, gemsoundtime, stationswrk, pvsndgblk, pvnlvls, &pvnstns, &offset, strlen(proffile2), strlen(gemsoundtime), strlen(stationswrk)); offset+=20; offset2+=20; nstawrk-=20; }; strncpy(stationswrk,stations+offset2*4,nstawrk*4); stationswrk[nstawrk*4]='\0'; get_pvsoundings (proffile2, gemsoundtime, stationswrk, pvsndgblk, pvnlvls, &pvnstns, &offset, strlen(proffile2), strlen(gemsoundtime), strlen(stationswrk)); break; } } nsta=g_nprofstns+g_nvadstns; /* cnvrtsndgblktoilvls(pvsndgblk,pvsndg,pvnlvls,nsta); */ cnvrtsndgblktoilvls(pvsndgblk,pvsndg,pvnlvls,nsta,levels,14); cnvrtsndgblktoilvls(pvsndgblk,pvsndghodo,pvnlvls, nsta,levelshodo,20); DrawProfVadWindData(); cnvrtpvsndgtouandv(pvsndghodo,sta_lat2,sta_lon2,nsta,staxywrk,vawndwrk,20); setmaxwindinhodo(pvsndghodo, levelshodo, nsta, 20); InitSaveHodoBg(pv_hodo); XFreeCursor(g_display,cursor); NuiDefaultCursor( pv_station ); if (! g_pv_timersw) { g_pv_timer=XtAppAddTimeOut(XtWidgetToApplicationContext(w),900000,UpdatePVDisplay, w); g_pv_timersw=-1; } } static void UpdatePVDisplay (XtPointer w, XtIntervalId* timer) { int iret; iret = UpdateTimeList(); g_pv_timersw=0; XmListSelectPos(pvfile_timelist,1,True); /* timer = (XtIntervalId*) XtAppAddTimeOut(XtWidgetToApplicationContext(w),120000,(XtTimerCallbackProc) UpdatePVDisplay, w); */ } /*NP*/ /********************************************************************/ /* CNVRTSNDGBLKTOILVLS (LJH) */ /********************************************************************/ cnvrtsndgblktoilvls(float pvsndgblk[][300],float pvsndg[][3][200], int pvnlvls[],int pvnstns, unsigned levels[],int nlvls) { const float pi=3.14159; float dir[50],mag[50],height[50]; float dir1,mag1; int i,j,n,i1; float u[50],v[50],u1,v1,u2,v2,uf,vf,angle; unsigned hght1,startlevel,endlevel,h1,h2; int lowlvlsub,hilvlsub,dir2,mag2; lowlvlsub=hilvlsub=1; for (i=0;i=startlevel && lowlvlsub==0) /* Change > to >= */ lowlvlsub=i; if (levels[i]<=endlevel) /* Change < to <= */ hilvlsub=i; } for (i=lowlvlsub;i<=hilvlsub;i++) { for (j=0;j=height[j] && levels[i] <= height[j+1]) { /* Change >= <= */ dir1=dir[j]; dir2=dir[j+1]; mag1=mag[j]; mag2=mag[j+1]; h1=height[j]; h2=height[j+1]; u1=-mag1*sin(pi-dir1*pi/180); v1=mag1*cos(pi-dir1*pi/180); u2=-mag2*sin(pi-dir2*pi/180); v2=mag2*cos(pi-dir2*pi/180); h1=height[j]; h2=height[j+1]; uf=u1+(u2-u1)/(h2-h1)*(levels[i]-h1); vf=v1+(v2-v1)/(h2-h1)*(levels[i]-h1); if (fabs(uf)>0.1 && fabs(vf)>0.1) { angle=(pi+acos(vf/sqrt(uf*uf+vf*vf))*SGN(uf))*180/pi; mag1=sqrt(uf*uf+vf*vf); } else { angle=2*pi; mag1=0; } pvsndg[i][0][i1]=levels[i]; pvsndg[i][1][i1]=angle; pvsndg[i][2][i1]=mag1; break; } } } } } cnvrtpvsndgtouandv(float pvsndg[][3][200], float stalat[], float stalng[], int nsta, float stnsxywrk[2][200],float vawnd[200][39],int nlvls) { int i,j,dir,speed,np,iret; float lat,lon,xloc,yloc; char sys1[2],sys2[2]; np=1; /* for (i=1;i<=nsta;i++) { */ for (i=0;i 0.0) return(1); else if (fabs(x)<.0001) /* x ~=0.0 ? */ return(1); else return(-1); } /*NP*/ /**********************************************************************/ /* PSECTION_HGHT_CB (LJH) */ /**********************************************************************/ void psection_hght_cb (Widget w, XtPointer client_data, XtPointer call_data) { g_hghtno = (int) client_data+1; DrawProfVadWindData(); } /*NP*/ /**********************************************************************/ /* DRAWPROFVADWINDDATA (LJH) */ /**********************************************************************/ DrawProfVadWindData() { int i, j, iret, mapindx=0; Window gwin; GC gemgc; int xwdth, xhght, xdpth; char gemdevice[72]; Dimension wdth,hght; float lat,lon,xloc,yloc; char sys1[2],sys2[2]; int dir,speed; int np=1; int diroffset=0; unsigned levels[14]={0,3000,5000,8000,10000,12000,15000,18000, 20000,25000,30000,40000,50000,60000}; char buf[80]; XtVaGetValues(pv_station, XmNwidth, &wdth, XmNheight, &hght, NULL); xwdth = (int)wdth; xhght = (int)hght; xdpth = DefaultDepthOfScreen(XtScreen(pv_station)); /* * Set the window and graphics context. */ g_display = XtDisplay(pv_station); g_window = XtWindow(pv_station); g_gc = XCreateGC(gemdisplay, g_window, 0, 0); xmotifw(g_window, "maptoppv", g_gc, xwdth, xhght, xdpth, &iret); strcpy ( gemdevice, "maptoppv" ); gslwin(gemdevice, &iret, strlen(gemdevice)); map_init(&iret, gemdevice, strlen(gemdevice)); gclear(&iret); draw_map(mapindx, map_info, 1, &mapb, &iret); initturtle(xwdth,xhght); for (i=0;i=0 && dir<=360 && speed>=0 && speed<=250)) { printf ("Error in wind speed for station # %d \n",i); } else { diroffset=g_LNGC-lon; gtrans( sys1, sys2, &np, &lat, &lon, &xloc, &yloc, &iret, strlen(sys1), strlen(sys2) ); if (iitem, XmFONTLIST_DEFAULT_TAG, &choice ); sprintf ( gemsoundtime, "%s", choice ); XtFree (choice); g_raobModelSW=1; root=DefaultRootWindow(XtDisplay(time_reg)); if (!g_pixcreated) { time_window=XCreatePixmap(XtDisplay(time_reg),root,600,g_twdth,8); time_oper_window=XCreatePixmap(XtDisplay(time_oper_reg),root,100,40,8); g_pixcreated=-1; } XSetForeground(XtDisplay(time_reg), gc2, pixels[0] ); XFillRectangle (XtDisplay(time_reg), time_window, gc2, 0, 0, 600, g_twdth ); XSetForeground(XtDisplay(time_oper_reg),gc3,pixels[0]); XFillRectangle (XtDisplay(time_oper_reg), time_oper_window,gc3, 0, 0, 100, 40 ); XSetForeground(XtDisplay(time_reg), gc2, pixels[5] ); strcpy(timestring,"Observed Times:"); XDrawString( XtDisplay(time_reg), (time_window), gc2, 1, 10, timestring, strlen(timestring)); for (i=0;i< ntimes;i++) { strcpy(timestring,time_list[i]+4); timestring[5]='\0'; if (strcmp(gemsoundtime,time_list[i])==0) XSetForeground(XtDisplay(time_reg), gc2, pixels[2] ); else XSetForeground(XtDisplay(time_reg), gc2, pixels[5] ); XDrawString( XtDisplay(time_reg),(time_window),gc2,i*(8*5), 24, timestring,strlen(timestring)); } XCopyArea(XtDisplay(time_reg),time_window, XtWindow(time_reg), gc2, 0, 0, 600,g_twdth,0,0); Load_stationlist ( station_list ); } /*NP*/ void Load_gem_sounding () /*************************************************************/ /* LOAD_GEM_SOUNDING */ /*************************************************************/ { int newlev = 0, iret = 0; float ix1, ix2; char gemdevice[72], gemyaxis[72], gemtimes[72], *cptr; char gemlatlonstr[25]; XtVaGetValues ( draw_reg, XmNwidth, &xwdth, XmNheight, &xhght, NULL ); if ( gemsoundfile[0] != '\0' && gemsoundtime[0] != '\0' && gemsoundsta[0] != '\0' ) { if ( item_type == 1 ) { if (numlvl > 0) copy_sndg(); sndg2[0][0]=numlvl; get_gem_snd (gemsoundfile, gemsoundtime, gemsoundsta, sndg, &newlev, strlen(gemsoundfile), strlen(gemsoundtime), strlen(gemsoundsta)); numlvl = (short) newlev; XtUnmanageChild (gem_dialog); /* Wait 1/10th second -- 100 msec for box to Clear. This fixes problem with dissapearing pressures on left side of Skew-T. Tried using Core baseline "delay" routine and still had problems. Created "idle" routine which does the job */ idle(0.100); strcpy ( gemdevice, "datatop" ); gslwin(gemdevice, &iret, strlen(gemdevice)); g_lng=plotData.plt_mark.lon[0]; g_lat=plotData.plt_mark.lat[0]; g_elev=plotData.plt_mark.elev[0]; if (g_lng<0 && g_lat>0) sprintf(gemlatlonstr,"%4.1fN %5.1fW",g_lat,-g_lng); else if (g_lng>0 && g_lat>0) sprintf(gemlatlonstr,"%4.1fN %5.1fE",g_lat,g_lng); else if (g_lng<0 && g_lat<0) sprintf(gemlatlonstr,"%4.1fS %5.1fW",-g_lat,-g_lng); else sprintf(gemlatlonstr,"%4.1fS %5.1fE",-g_lat,g_lng); sprintf ( raobtitle, " %s %s %s %s ", sta_id, gemsoundsta, gemsoundtime, gemlatlonstr); strcpy( raob_type, "RAOB" ); sprintf(raob_type,"RAOB Elev=%5.0f ft", g_elev * 3.28); xtnd_sndg(); save_origsndg (); /* mode = 1; */ resize_callback ( draw_reg, (XtPointer)NULL, (XtPointer)NULL ); if ( numlvl > 2 && sndg[0][1] > 100. && (!(mode==2 || mode==3 || mode==4 || mode==5))) { pagenum = 1; define_parcel( current_parcel, user_level ); mean_wind( -1, -1, &ix1, &ix2, &st_dir, &st_spd); st_spd *= .75; show_parcel (); show_page( pagenum ); } } else if ( item_type == 2 ) { mode = 3; XtUnmanageChild (gem_dialog); sprintf ( gemyaxis, "0/%s/1000/2;0;1", x_hght ); cptr = gemsoundsta; cptr++; strcpy ( gemtimes, gemsoundtime ); strcat ( gemtimes, "-last" ); strcpy ( gemdevice, "datatop" ); gg_motf ( gemdevice, &iret, strlen(gemdevice) ); gslwin(gemdevice, &iret, strlen(gemdevice)); sncross (gemsoundfile, gemtimes, gemyaxis, cptr, strlen(gemsoundfile), strlen(gemtimes), strlen(gemyaxis), strlen(gemsoundsta)-1); /* Problems occur with overpainting screen when switching times or when switching profiler to vad or vad to profiler. Not sure why, but believe its related to how graphics functions are being called. Found by performing rendering of sncross twice under these conditions that problem is corrected. */ /* g_pv_timechange=-1; */ if (g_pv_timechange) { gg_motf ( gemdevice, &iret, strlen(gemdevice) ); gslwin(gemdevice, &iret, strlen(gemdevice)); sncross (gemsoundfile, gemtimes, gemyaxis, cptr, strlen(gemsoundfile), strlen(gemtimes), strlen(gemyaxis), strlen(gemsoundsta)-1); g_pv_timechange=0; } XCopyArea ( XtDisplay(draw_reg), XtWindow(draw_reg), canvas, gc, 0, 0, xwdth, xhght, 0, 0 ); XFlush(XtDisplay(draw_reg)); } } } /*NP*/ void print_gem_snd(float sndg[][7],int nlvl) { int i; printf("*********** \n"); for (i=0;i 10 && fabs(ydev[0] - ydev[1]) > 10 ) { /* * Points need to be in lower-left, upper-right order */ if (xdev[0] > xdev[1]) { i = xdev[0]; xdev[0] = xdev[1]; xdev[1] = i; } if (ydev[0] < ydev[1]) { i = ydev[0]; ydev[0] = ydev[1]; ydev[1] = i; } strcpy ( sysout, "M" ); gtrans(sysin, sysout, &np, xdev, ydev, xpts, ypts, &iret, strlen(sysin), strlen(sysout)); if ( iret == 0 ) { for ( i = 0; i < np; i++) { mapb.x[i] = xpts[i]; mapb.y[i] = ypts[i]; } gclear(&iret); draw_map(mapindx, map_info, 1, &mapb, &iret); } } /* * Reset the zoom button */ mdl_info_zoom_cb( w, NULL, NULL); } else { zoom_state = 0; /* * restore default cursor */ NuiDefaultCursor( gemlbl_station2 ); /* * Restore mouse to be selection status */ XSelectInput( gemdisplay, XtWindow(gemlbl_station2), ButtonPressMask | ButtonReleaseMask | ExposureMask ); } XtAddEventHandler( gemlbl_station2, ButtonPressMask, FALSE, GetSoundingForLatLon, NULL ); XtAddEventHandler( gemlbl_station2, PointerMotionMask, FALSE, (XtEventHandler)mdlmap_pointer, (XtPointer)NULL); } /*NP*/ void mdl_info_unzoom_cb (Widget w, XtPointer client_data, XtPointer call_data) /****************************************************************/ /* MDL_INFO_UNZOOM_CB */ /****************************************************************/ { int iret; char gemdevice[72]; strcpy(gemdevice,"maptop2"); markSW=0; map_init(&iret, gemdevice, strlen(gemdevice)); gem_info_unzoom_cb (w, client_data, call_data); } /*NP*/ void gem_info_cancel_cb (Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* GEM_INFO_CANCEL_CB */ /*************************************************************/ { XtUnmanageChild (gem_dialog); } /*NP*/ void gem_info_world_cb (Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* GEM_INFO_WORLD_CB (LJH) */ /*************************************************************/ { gem_info_unzoom_cb(w, client_data, call_data); } void gem_info_US_cb (Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* GEM_INFO_US_CB (LJH) */ /*************************************************************/ { int i, iret,mapindx=0; strcpy ( map_info[0].name, "US" ); strcpy ( map_info[0].proj, "STR/90;-105;0/nm" ); strcpy ( map_info[0].garea, "22.88;-120.49;46.02;-60.83" ); mapb.x[0] = 22.88;mapb.x[1]=46.02; mapb.y[0] = -120.49;mapb.y[1]=-60.83; gclear(&iret); draw_map(mapindx, map_info, 0, &mapb, &iret); if (markSW) { get_gem_stns ( gemsoundfile, station_tbl, gemsoundtime, statlist, &nsta, sta_lat, sta_lon, &item_type, strlen (gemsoundfile), strlen (station_tbl), strlen (gemsoundtime)); map_mark ( &nsta, sta_lat, sta_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] ); } } } /*NP*/ void gem_info_TROP_SFC_cb (Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* GEM_INFO_TROP_SFC_CB (LJH) */ /*************************************************************/ { int i, iret,mapindx=0; strcpy(map_info[0].name,"NWWRD1"); strcpy(map_info[0].proj, "CED/nm"); strcpy(map_info[0].garea, "8;-100;33;-55.00" ); mapb.x[0]=8;mapb.x[1]=33; mapb.y[0]=-100;mapb.y[1]=-55; gclear(&iret); draw_map(mapindx, map_info, 0, &mapb, &iret); if (markSW) { get_gem_stns ( gemsoundfile, station_tbl, gemsoundtime, statlist, &nsta, sta_lat, sta_lon, sta_elev, &item_type, strlen (gemsoundfile), strlen (station_tbl), strlen (gemsoundtime)); map_mark ( &nsta, sta_lat, sta_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] ); } } } /*NP*/ void gem_info_OFAGX_cb(Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* GEM_INFO_OFAGX_CB (LJH) */ /*************************************************************/ { int i, iret,mapindx=0; strcpy(map_info[0].name,"NWWRD1"); strcpy(map_info[0].proj, "CED/nm"); strcpy(map_info[0].garea, "20;-100;35;-80.00" ); mapb.x[0]=20;mapb.x[1]=35; mapb.y[0]=-100;mapb.y[1]=-80; gclear(&iret); draw_map(mapindx, map_info, 0, &mapb, &iret); if (markSW) { get_gem_stns ( gemsoundfile, station_tbl, gemsoundtime, statlist, &nsta, sta_lat, sta_lon, sta_elev, &item_type, strlen (gemsoundfile), strlen (station_tbl), strlen (gemsoundtime)); map_mark ( &nsta, sta_lat, sta_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]; stnList.elv[i] = sta_elev[i]; strcpy ( stnList.stnName[i], statlist[i] ); } } } /*NP*/ void gem_info_ATL_cb(Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* GEM_INFO_ATL_CB (LJH) */ /*************************************************************/ { int i, iret,mapindx=0; strcpy(map_info[0].name,"NWWRD1"); strcpy(map_info[0].proj, "CED/nm"); strcpy(map_info[0].garea, "8;-100;50;-38" ); mapb.x[0]=8;mapb.x[1]=50; mapb.y[0]=-100;mapb.y[1]=-38; gclear(&iret); draw_map(mapindx, map_info, 0, &mapb, &iret); if (markSW) { get_gem_stns ( gemsoundfile, station_tbl, gemsoundtime, statlist, &nsta, sta_lat, sta_lon, sta_elev, &item_type, strlen (gemsoundfile), strlen (station_tbl), strlen (gemsoundtime)); map_mark ( &nsta, sta_lat, sta_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]; stnList.elv[i] = sta_elev[i]; strcpy ( stnList.stnName[i], statlist[i] ); } } } /*NP*/ void gem_info_PAC_cb(Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* GEM_INFO_PAC_CB (LJH) */ /*************************************************************/ { int i, iret,mapindx=0; strcpy(map_info[0].name,"NWWRD1"); strcpy(map_info[0].proj, "CED/nm"); strcpy(map_info[0].garea, "-6;150;65;-110" ); mapb.x[0]=-6;mapb.x[1]=65; mapb.y[0]=150;mapb.y[1]=-110; gclear(&iret); draw_map(mapindx, map_info, 0, &mapb, &iret); if (markSW) { get_gem_stns ( gemsoundfile, station_tbl, gemsoundtime, statlist, &nsta, sta_lat, sta_lon, sta_elev, &item_type, strlen (gemsoundfile), strlen (station_tbl), strlen (gemsoundtime)); map_mark ( &nsta, sta_lat, sta_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]; stnList.elv[i] = sta_elev[i]; strcpy ( stnList.stnName[i], statlist[i] ); } } } void gem_info_STABMAP_cb (Widget w, XtPointer client_data, XtPointer call_data) /**********************************************************/ /* GEM_INFO_STABMAP_CB */ /**********************************************************/ { static Widget stabmapform, stabmapform2,stabmappane, stabmap_exit,stabmap_print,printctrl,printlarge, printnormal, row, button1, button2, button3, button4, stnScale,stabmap_apply; XmString stabmap_title; int elev,i,newlev; char stanum[6], sta_tmp[12]; char buf[80]; int ival,np,iret; int l1bot,l1top,l1ints,l1type,l1prob,l2bot,l2top,l2ints,l2type,l2prob,nflag; float lat,lon,xloc,yloc; char sys1[2]; char sys2[2]; Dimension wdth,hght; Window gwin; GC gemgc; int xwdth, xhght, xdpth; int mapindx=0; char gemdevice[72]; int xc,yc; char work; XmString title; int n=0; if (! stabmap_dialog ) { stabmap_title = XmStringCreateLocalized( "STABMAP" ); stabmap_dialog = XmCreateBulletinBoardDialog(toplevel, "stabmap_panel", NULL, 0); XtVaSetValues(stabmap_dialog, XmNdialogTitle, stabmap_title, NULL); /* XmStringFree(icemap_title); */ stabmappane = XtVaCreateManagedWidget("parcel_pane", xmPanedWindowWidgetClass, stabmap_dialog, XmNsashWidth, 1, XmNsashHeight, 1, NULL); stabmapform = XtVaCreateWidget("form", xmFormWidgetClass, stabmappane, XmNfractionBase, 7, NULL ); stabmap_station = XtVaCreateManagedWidget("map3", xmDrawingAreaWidgetClass, stabmapform, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNheight, 800, XmNwidth, 1024, XmNbackground, pixels[0], NULL); XtManageChild (stabmapform); stabmapform2 = XtVaCreateWidget("form", xmFormWidgetClass, stabmappane, XmNfractionBase, 7, NULL ); stabmap_exit = XtVaCreateManagedWidget ("EXIT", xmPushButtonWidgetClass, stabmapform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 1, NULL ); XtAddCallback(stabmap_exit, XmNactivateCallback, (XtCallbackProc)stabmap_info_exit_cb, NULL); stabmap_print = XtVaCreateManagedWidget ("PRINT", xmPushButtonWidgetClass, stabmapform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 2, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 3, NULL ); XtAddCallback(stabmap_print, XmNactivateCallback, (XtCallbackProc)stabmap_info_print_cb, NULL); printctrl = XtVaCreateManagedWidget("printctrl", xmRowColumnWidgetClass, stabmapform2, XmNradioBehavior, True, XmNradioAlwaysOne, True, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 3, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL); printlarge = CreateRadioButton(printctrl, "11x17 inches", (XtCallbackProc) printctrl_toggleCB, (XtPointer) "11x17"); printnormal = CreateRadioButton(printctrl, "8.5x11 inches", (XtCallbackProc) printctrl_toggleCB, (XtPointer) "8.5x11"); XmToggleButtonSetState(printlarge,True, True); row=XtVaCreateManagedWidget("row", xmRowColumnWidgetClass, stabmapform2, XmNradioBehavior, True, XmNradioAlwaysOne, True, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 5, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 6, NULL); button1= CreateRadioButton(row, "map1", (XtCallbackProc) stabmap_toggleCB, (XtPointer) "Map1"); button2= CreateRadioButton(row, "map2", (XtCallbackProc) stabmap_toggleCB, (XtPointer) "Map2"); button3= CreateRadioButton(row, "map3", (XtCallbackProc) stabmap_toggleCB, (XtPointer) "Map3"); button4= CreateRadioButton(row, "map4", (XtCallbackProc) stabmap_toggleCB, (XtPointer) "Map4"); /* Build Scale Widget */ title = XmStringCreateLocalized("Filter Stations"); stnScale=XtVaCreateManagedWidget("stnscale",xmScaleWidgetClass, stabmapform2, XmNshowValue,True, XmNtitleString, title, XmNorientation,XmHORIZONTAL, XmNdecimalPoints,1, XmNminimum,0, XmNmaximum,10, XmNvalue,8, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 6, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 7, NULL); XtAddCallback(stnScale,XmNvalueChangedCallback, (XtCallbackProc) scaleCB, (XtPointer) NULL); XtAddCallback(stnScale, XmNdragCallback, (XtCallbackProc) scaleCB, (XtPointer) NULL); strcpy(g_stnfilter,"0.8"); XtManageChild (stnScale); XtManageChild (stabmapform2); XtManageChild (stabmappane); XtManageChild (stabmap_dialog); stabmap_mapw_rgstr(stabmap_station); XmToggleButtonSetState(button1,True, True); } else { XtManageChild (stabmap_dialog); strcpy ( gemdevice, "maptopstab" ); gslwin(gemdevice, &iret, strlen(gemdevice)); } GenStabMap(); } Widget CreateRadioButton(Widget parent, char* name, XtCallbackProc callback, XtPointer client_data) { Widget toggle; toggle=XtVaCreateManagedWidget(name, xmToggleButtonWidgetClass, parent, XmNindicatorType, XmONE_OF_MANY, NULL); XtAddCallback(toggle, XmNvalueChangedCallback, callback, client_data); XtVaSetValues(toggle, XmNindicatorOn, True, XmNfillOnSelect, True, NULL); return toggle; } void scaleCB(Widget widget, XtPointer client_data, XtPointer call_data) { XmScaleCallbackStruct* ptr; short decimal; float value; ptr = (XmScaleCallbackStruct*) call_data; if (ptr->reason==XmCR_VALUE_CHANGED) { XtVaGetValues(widget, XmNdecimalPoints, &decimal, NULL); value = (float) ptr->value; while (decimal > 0) { value = value/ (float) 10.0; decimal=decimal-1; } sprintf(g_stnfilter,"%f",value); GenStabMap(); } } void printctrl_toggleCB(Widget widget, XtPointer client_data, XtPointer call_data) { XmToggleButtonCallbackStruct* ptr; ptr=(XmToggleButtonCallbackStruct*) call_data; if (ptr != NULL) { if (ptr->set == True) { if (strcmp( (char *) client_data,"11x17")==0) { g_printctrl_l=17.0; g_printctrl_w=11.0; } else if (strcmp((char *)client_data,"8.5x11")==0) { g_printctrl_l=11.0; g_printctrl_w=8.5; } } } } void stabmap_toggleCB(Widget widget, XtPointer client_data, XtPointer call_data) { char gemdevice[72]; int iret; XmToggleButtonCallbackStruct* ptr; ptr=(XmToggleButtonCallbackStruct*) call_data; if (ptr != NULL) { if (ptr->set == True) { if (strcmp( (char *) client_data,"Map1")==0) strcpy(g_stabmap,"map1"); else if (strcmp((char *)client_data,"Map2")==0) strcpy(g_stabmap,"map2"); else if (strcmp((char *)client_data,"Map3")==0) strcpy(g_stabmap,"map3"); else if (strcmp((char *)client_data,"Map4")==0) strcpy(g_stabmap,"map4"); strcpy ( gemdevice, "maptopstab" ); gslwin(gemdevice, &iret, strlen(gemdevice)); GenStabMap(); } } } void GenStabMap() { char mode[80]; char gemdevice[72]; char dev[50]; int ival,np,iret; int l1bot,l1top,l1ints,l1type,l1prob,l2bot,l2top,l2ints,l2type,l2prob,nflag; float lat,lon,xloc,yloc; char sys1[2]; char sys2[2]; Dimension wdth,hght; int elev,i,newlev; char stanum[6], sta_tmp[12]; int xc,yc,ier; char work; Cursor cursor=(Cursor) None; /* Generate a gc for drawing into map*/ NxmCursorChange( stabmap_station, XC_watch, ""); cursor=XCreateFontCursor(g_display,XC_watch); XDefineCursor(g_display,g_window,cursor); XtVaGetValues(stabmap_station, XmNwidth, &wdth, XmNheight, &hght, NULL); xwdth = (int)wdth; xhght = (int)hght; xdpth = DefaultDepthOfScreen(XtScreen(stabmap_station)); strcpy ( gemdevice, "maptopstab" ); gg_motf(gemdevice,&iret,strlen(gemdevice)); gslwin(gemdevice, &iret, strlen(gemdevice)); strcpy(mode,"display"); strcpy(dev,"XWP|maptopstab"); gg_sdev(dev,&ier,strlen(dev)); plot_indices(g_stabmap, mode, gemsoundfile, gemsoundtime, g_stnfilter, dev, strlen(g_stabmap), strlen(mode), strlen(gemsoundfile), strlen(gemsoundtime),strlen(g_stnfilter), strlen(dev)); XFreeCursor(g_display,cursor); NuiDefaultCursor( stabmap_station ); } /*NP*/ void stabmap_info_print_cb (Widget w, XtPointer client_data, XtPointer call_data) { char gemdevice[80]; char mode[80]; char dev[50]; FILE *fp; char unixcmd[200]; char OS[20]; int iret,ier; strcpy(mode,"print"); sprintf(dev,"PS|/tmp/planstnplot.ps|%4.1f;%4.1f|M",g_printctrl_l,g_printctrl_w); /* strcpy(dev,"PS|/tmp/planstnplot.ps|11.0;8.5|M"); */ gg_sdev(dev,&ier,strlen(dev)); strcpy(gemdevice,"maptopstab"); gg_motf(gemdevice,&iret,strlen(gemdevice)); gslwin(gemdevice, &iret, strlen(gemdevice)); plot_indices(g_stabmap,mode,gemsoundfile,gemsoundtime,g_stnfilter, dev,strlen(g_stabmap),strlen(mode),strlen(gemsoundfile), strlen(gemsoundtime),strlen(g_stnfilter),strlen(dev)); strcpy(dev,"XWP|maptopstab"); gg_sdev(dev,&ier,strlen(dev)); if (ier != 0) { printf(" error calling gg_sdev, ier = %d\n", ier); } strcpy(OS,getenv("OS")); if (strncmp(OS,"Linux",5)==0) sprintf(unixcmd,"lpr %s", "/tmp/planstnplot.ps"); else sprintf(unixcmd,"lp -onb -oletter %s", "/tmp/planstnplot.ps"); system(unixcmd); sprintf(unixcmd,"rm -f %s; rm -f /tmp/planstnplot.ps", config.filename ); system(unixcmd); } /*NP*/ void gem_info_ICEMAP_cb (Widget w, XtPointer client_data, XtPointer call_data) /**********************************************************/ /* GEM_INFO_ICEMAP_CB */ /**********************************************************/ { static Widget icemapform, icemapform2, icemappane,icemap_exit,icemap_zoom,icemap_unzoom; XmString icemap_title; int elev,i,newlev; char stanum[6], sta_tmp[12]; char buf[80]; int ival,np,iret; int l1bot,l1top,l1ints,l1type,l1prob,l2bot,l2top,l2ints,l2type,l2prob,nflag; float lat,lon,xloc,yloc; char sys1[2]; char sys2[2]; Dimension wdth,hght; Window gwin; GC gemgc; int xwdth, xhght, xdpth; int mapindx=0; char gemdevice[72]; int xc,yc; char work; if (! icemap_dialog ) { icemap_title = XmStringCreateLocalized( "ICEMAP" ); icemap_dialog = XmCreateBulletinBoardDialog(toplevel, "icemap_panel", NULL, 0); XtVaSetValues(icemap_dialog, XmNdialogTitle, icemap_title, NULL); /* XmStringFree(icemap_title); */ icemappane = XtVaCreateManagedWidget("parcel_pane", xmPanedWindowWidgetClass, icemap_dialog, XmNsashWidth, 1, XmNsashHeight, 1, NULL); icemapform = XtVaCreateWidget("form", xmFormWidgetClass, icemappane, XmNfractionBase, 7, NULL ); icemap_station = XtVaCreateManagedWidget("map3", xmDrawingAreaWidgetClass, icemapform, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNheight, 800, XmNwidth, 1024, XmNbackground, pixels[0], NULL); /*XtAddCallback(icemap_station, XmNexposeCallback, mapw_exposeCb, NULL ); */ XtManageChild (icemapform); icemapform2 = XtVaCreateWidget("form", xmFormWidgetClass, icemappane, XmNfractionBase, 7, NULL ); icemap_exit = XtVaCreateManagedWidget ("EXIT", xmPushButtonWidgetClass, icemapform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 1, NULL ); XtAddCallback(icemap_exit, XmNactivateCallback, (XtCallbackProc)icemap_info_exit_cb, NULL); icemap_zoom = XtVaCreateManagedWidget ("ZOOM", xmPushButtonWidgetClass, icemapform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 2, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 3, NULL ); XtAddCallback(icemap_zoom, XmNactivateCallback, (XtCallbackProc)icemap_info_zoom_cb, NULL); icemap_unzoom = XtVaCreateManagedWidget ("UNZOOM", xmPushButtonWidgetClass, icemapform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 3, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL ); XtAddCallback(icemap_unzoom, XmNactivateCallback, (XtCallbackProc)icemap_info_unzoom_cb, NULL); XtManageChild (icemapform2); XtManageChild (icemappane); XtManageChild (icemap_dialog); icemap_mapw_rgstr(icemap_station); } else { XtManageChild (icemap_dialog); /*mapw_rgstr( gemlbl_station); icemap_mapw_rgstr(icemap_station);*/ strcpy ( map_info[0].name, "US" ); strcpy ( map_info[0].proj, "STR/90;-105;0/nm" ); strcpy ( map_info[0].garea, "22.88;-120.49;46.02;-60.83" ); mapb.x[0] = 22.88;mapb.x[1]=46.02; mapb.y[0] = -120.49;mapb.y[1]=-60.83; strcpy ( gemdevice, "maptopice" ); gslwin(gemdevice, &iret, strlen(gemdevice)); map_init(&iret, gemdevice, strlen(gemdevice)); gclear(&iret); draw_map(mapindx, map_info, 1, &mapb, &iret); } GenIceMap(); } /*NP*/ void GenIceMap() /*****************************************************************/ /* GENICEMAP */ /*****************************************************************/ { char buf[80]; char gemdevice[72]; int ival,np,iret; int l1bot,l1top,l1ints,l1type,l1prob,l2bot,l2top,l2ints,l2type,l2prob,nflag; float lat,lon,xloc,yloc; char sys1[2]; char sys2[2]; Dimension wdth,hght; int elev,i,newlev; char stanum[6], sta_tmp[12]; int xc,yc; char work; Cursor cursor=(Cursor) None; /*Generate a gc for drawing into map*/ /*NxmCursorChange( icemap_station, XC_watch, "");*/ cursor=XCreateFontCursor(g_display,XC_watch); XDefineCursor(g_display,g_window,cursor); XtVaGetValues(icemap_station, XmNwidth, &wdth, XmNheight, &hght, NULL); xwdth = (int)wdth; xhght = (int)hght; xdpth = DefaultDepthOfScreen(XtScreen(icemap_station)); strcpy ( gemdevice, "maptopice" ); gslwin(gemdevice, &iret, strlen(gemdevice)); XSetForeground(g_display,g_gc,pixels[5]); initturtle(xwdth,xhght); XFlush(g_display); strcpy(buf,"AIRCRAFT ICING"); XDrawString(g_display,g_window,g_gc,300,710,buf,strlen(buf)); sprintf(buf,"%s RAOBS",gemsoundtime); XDrawString(g_display,g_window,g_gc,300,730,buf,strlen(buf)); sprintf(buf,"C5BM20,700;%s",Trace_Ice_Sym); draw(buf); XSetForeground(g_display,g_gc,pixels[27]); strcpy(buf,"TRACE"); XDrawString(g_display,g_window,g_gc,45,710,buf,strlen(buf)); sprintf(buf,"C5BM20,720;%s",Light_Ice_Sym); draw(buf); XSetForeground(g_display,g_gc,pixels[27]); strcpy(buf,"LIGHT"); XDrawString(g_display,g_window,g_gc,45,730,buf,strlen(buf)); sprintf(buf,"C5BM20,740;%s",Moderate_Ice_Sym); draw(buf); XSetForeground(g_display,g_gc,pixels[27]); strcpy(buf,"MODERATE"); XDrawString(g_display,g_window,g_gc,45,750,buf,strlen(buf)); sprintf(buf,"C5BM20,760;%s",Severe_Ice_Sym); draw(buf); XSetForeground(g_display,g_gc,pixels[27]); strcpy(buf,"SEVERE"); XDrawString(g_display,g_window,g_gc,45,770,buf,strlen(buf)); /*Cycle through station data at specific time for icing potential */ for (i=0;i0 && yc>0 && xc<1024 && yc<800) { if (nflag) { DrawIcingData(XtDisplay(icemap_station),XtWindow(icemap_station),g_gc,xc,yc-10,l1bot,l1top,l1ints,l1type,l1prob,-1); DrawIcingData(XtDisplay(icemap_station),XtWindow(icemap_station),g_gc,xc,yc+12,l2bot,l2top,l2ints,l2type,l2prob,1); } else { XSetForeground(XtDisplay(icemap_station),g_gc,pixels[24]); strcpy(buf,"NIL"); XDrawString(g_display,g_window,g_gc,xc-getgtextextent(buf)/2,yc+15,buf,strlen(buf)); } } XFlush(XtDisplay(icemap_station)); } if (g_icemappixcreated) XFreePixmap(XtDisplay(icemap_station),icemap_window); icemap_window=XCreatePixmap(XtDisplay(icemap_station),root,1024,800,8); g_icemappixcreated=-1; XCopyArea(XtDisplay(icemap_station),XtWindow(icemap_station), icemap_window,g_gc,0,0,1024,800,0,0); XFlush(XtDisplay(icemap_station)); XtAddCallback(icemap_station, XmNexposeCallback, (XtCallbackProc)expose_icemap_station_overlays, NULL); XtAddCallback(icemap_station, XmNresizeCallback, (XtCallbackProc)resize_icemap_station_overlays, NULL); XFreeCursor(g_display,cursor); NuiDefaultCursor( icemap_station ); } /*NP*/ void icemap_info_zoom_cb (Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* ICEMAP_INFO_ZOOM_CB */ /*************************************************************/ { static int zoom_state=0; int i, ityp, np, iret, mapindx=0; char sysin[2], sysout[2]; float xpts[2], ypts[2], xdev[2], ydev[2]; char gemdevice[72]; if(zoom_state == 0) { zoom_state = 1; /* * Change mouse event handling for zooming */ /* * change to the zoom cursor */ NxmCursorChange( icemap_station, XC_crosshair, "white"); XmUpdateDisplay( w ); ityp = 3; /* 2; */ np = 2; strcpy ( sysin, "D" ); for ( i = 0; i < np; i++) xpts[i] = ypts[i] = 0.0; ggtpnt( sysin, &ityp, xdev, ydev, &iret, strlen(sysin)); /* * check if the box is big enough */ if ( fabs(xdev[0] - xdev[1]) > 10 && fabs(ydev[0] - ydev[1]) > 10 ) { /* * Points need to be in lower-left, upper-right order */ if (xdev[0] > xdev[1]) { i = xdev[0]; xdev[0] = xdev[1]; xdev[1] = i; } if (ydev[0] < ydev[1]) { i = ydev[0]; ydev[0] = ydev[1]; ydev[1] = i; } strcpy ( sysout, "M" ); gtrans(sysin, sysout, &np, xdev, ydev, xpts, ypts, &iret, strlen(sysin), strlen(sysout)); if ( iret == 0 ) { for ( i = 0; i < np; i++) { mapb.x[i] = xpts[i]; mapb.y[i] = ypts[i]; } gclear(&iret); draw_map(mapindx, map_info, 1, &mapb, &iret); GenIceMap(); } } /* * Reset the zoom button */ icemap_info_zoom_cb( w, NULL, NULL); } else { zoom_state = 0; /* * restore default cursor */ NuiDefaultCursor( icemap_station ); /* * Restore mouse to be selection status */ XSelectInput( gemdisplay, XtWindow(icemap_station), ButtonPressMask | ButtonReleaseMask | ExposureMask ); } } /*NP*/ void icemap_info_unzoom_cb (Widget w, XtPointer client_data, XtPointer call_data) /***********************************************************/ /* ICEMAP_INFO_UNZOOM_CB */ /***********************************************************/ { gem_info_ICEMAP_cb(w, client_data, call_data); } /*NP*/ void expose_icemap_station_overlays (Widget w, XmDrawingAreaCallbackStruct *call_data) /**************************************************************/ /* EXPOSE_ICEMAP_STATION_OVERLAYS */ /**************************************************************/ { XCopyArea(XtDisplay(icemap_station), icemap_window, XtWindow(icemap_station), g_gc, 0, 0, 1024, 800, 0, 0); XFlush(XtDisplay(icemap_station)); } /*NP*/ void resize_icemap_station_overlays (Widget w,XmDrawingAreaCallbackStruct *call_data) /***************************************************************/ /* RESIZE_ICEMAP_STATION_OVERLAYS */ /***************************************************************/ { XCopyArea(XtDisplay(icemap_station), icemap_window, XtWindow(icemap_station), g_gc, 0, 0, 1024, 800, 0, 0); XFlush(XtDisplay(icemap_station)); } /*NP*/ void DrawIcingData(Display *dsp, Window win, GC gc,int xc,int yc, int bot,int top,int ints,int type, int prob,int sgn) /****************************************************************/ /* DRAWICINGDATA */ /****************************************************************/ { char buf[80]; Font font_info; static char font_2 [] = { "-adobe-courier-bold-r-normal--14-100-100-100-m-90-iso8859-1" }; font_info = XLoadFont(dsp, font_2 ); XSetFont(dsp, gc, font_info ); if(font_struct != NULL) XFreeFontInfo(NULL,font_struct,0); font_struct = XQueryFont ( dsp, font_info); XSetForeground(dsp,gc,pixels[27]); if (bot>0) { sprintf(buf,"%d",(int)(bot*.0328+.5)); XDrawString(dsp,win,gc,xc-35,yc+5,buf,strlen(buf)); } if (top>0) { sprintf(buf,"%d",(int)(top*.0328+.5)); XDrawString(dsp,win,gc,xc+10,yc+5,buf,strlen(buf)); } if (ints>0) { if (sgn<0) sprintf(buf,"C5BM%d,%d;",xc-7,yc-5); else sprintf(buf,"C5BM%d,%d;",xc-7,yc-3); switch (ints) { case 2: strcat(buf,Trace_Ice_Sym); break; case 3: strcat(buf,Light_Ice_Sym); break; case 4: strcat(buf,Moderate_Ice_Sym); break; case 5: strcat(buf,Severe_Ice_Sym); break; } draw(buf); } if (prob>0) { XSetForeground(dsp,gc,pixels[5]); sprintf(buf,"%d",prob); XDrawString(dsp,win,gc,xc-30,yc+sgn*15+5,buf,strlen(buf)); } if (type>0) { XSetForeground(dsp,gc,pixels[21]); switch (type) { case 1: strcpy(buf,"CLR"); break; case 2: strcpy(buf,"RIM"); break; case 3: strcpy(buf,"MXD"); break; } XDrawString(dsp,win,gc,xc-getgtextextent(buf)/2,yc+sgn*15+5,buf,strlen(buf)); } } /*NP*/ void icemap_info_exit_cb (Widget w, XtPointer client_data, XtPointer call_data) /******************************************************************/ /* ICEMAP_INFO_EXIT_CB */ /******************************************************************/ { int i, iret,mapindx=0; char gemdevice[72]; XtUnmanageChild (icemap_dialog); strcpy ( gemdevice, "maptop" ); gslwin(gemdevice, &iret, strlen(gemdevice)); map_init(&iret, gemdevice, strlen(gemdevice)); strcpy ( map_info[0].name, "US" ); strcpy ( map_info[0].proj, "STR/90;-105;0/nm" ); strcpy ( map_info[0].garea, "22.88;-120.49;46.02;-60.83" ); mapb.x[0] = 22.88;mapb.x[1]=46.02; mapb.y[0] = -120.49;mapb.y[1]=-60.83; gclear(&iret); draw_map(mapindx, map_info, 1, &mapb, &iret); Load_stationlist ( 0 ); } /*NP*/ void stabmap_info_exit_cb (Widget w, XtPointer client_data, XtPointer call_data) /******************************************************************/ /* STABMAP_INFO_EXIT_CB */ /******************************************************************/ { int i, iret,mapindx=0; char gemdevice[72]; XtUnmanageChild (stabmap_dialog); strcpy ( gemdevice, "maptop" ); gslwin(gemdevice, &iret, strlen(gemdevice)); map_init(&iret, gemdevice, strlen(gemdevice)); strcpy ( map_info[0].name, "US" ); strcpy ( map_info[0].proj, "STR/90;-105;0/nm" ); strcpy ( map_info[0].garea, "22.88;-120.49;46.02;-60.83" ); mapb.x[0] = 22.88;mapb.x[1]=46.02; mapb.y[0] = -120.49;mapb.y[1]=-60.83; gclear(&iret); draw_map(mapindx, map_info, 1, &mapb, &iret); Load_stationlist ( 0 ); } /*NP*/ stabmap_mapw_rgstr(mapwin) /***************************************************************/ /* STABMAP_MAPW_RGSTR */ /***************************************************************/ Widget mapwin; { XColor cred; Dimension wdth, hght; Cursor curs; int xwdth, xhght, xdpth; int iret, mapindx=0; char gemdevice[72]; /*---------------------------------------------------------------------*/ /* * Get the map window geometry. */ XtVaGetValues(mapwin, XmNwidth, &wdth, XmNheight, &hght, NULL); xwdth = (int)wdth; xhght = (int)hght; xdpth = DefaultDepthOfScreen(XtScreen(mapwin)); /* * Set the window and graphics context. */ g_display = XtDisplay(mapwin); g_window = XtWindow(mapwin); g_gc = XCreateGC(gemdisplay, g_window, 0, 0); /* * Create a red arrow for the cursor. */ curs = XCreateFontCursor(gemdisplay, XC_top_left_arrow); XDefineCursor(gemdisplay, g_window, curs); cred.red = 65535; cred.blue = 0; cred.green = 0; cred.flags = DoRed | DoBlue | DoGreen; XRecolorCursor(gemdisplay, curs, &cred, &cred); /* * Set the fill rule. */ XSetFillRule(gemdisplay, g_gc, WindingRule); /* * Register the map window */ strcpy(gemdevice,"maptopstab"); xmotifw(g_window, gemdevice, g_gc, xwdth, xhght, xdpth, &iret); if( iret != 0 ) return( iret ); return( 0 ); } /*NP*/ icemap_mapw_rgstr(mapwin) /***************************************************************/ /* ICEMAP_MAPW_RGSTR */ /***************************************************************/ Widget mapwin; { XColor cred; Dimension wdth, hght; Cursor curs; int xwdth, xhght, xdpth; int iret, mapindx=0; char gemdevice[72]; /*---------------------------------------------------------------------*/ /* * Get the map window geometry. */ XtVaGetValues(mapwin, XmNwidth, &wdth, XmNheight, &hght, NULL); xwdth = (int)wdth; xhght = (int)hght; xdpth = DefaultDepthOfScreen(XtScreen(mapwin)); /* * Set the window and graphics context. */ g_display = XtDisplay(mapwin); g_window = XtWindow(mapwin); g_gc = XCreateGC(gemdisplay, g_window, 0, 0); /* * Create a red arrow for the cursor. */ curs = XCreateFontCursor(gemdisplay, XC_top_left_arrow); XDefineCursor(gemdisplay, g_window, curs); cred.red = 65535; cred.blue = 0; cred.green = 0; cred.flags = DoRed | DoBlue | DoGreen; XRecolorCursor(gemdisplay, curs, &cred, &cred); /* * Set the fill rule. */ XSetFillRule(gemdisplay, g_gc, WindingRule); /* * Register the map window */ strcpy(gemdevice,"maptopice"); xmotifw(g_window, gemdevice, g_gc, xwdth, xhght, xdpth, &iret); if( iret != 0 ) return( iret ); /* * Draw the US map. FORTRAN function map_init() */ map_init(&iret, gemdevice, strlen(gemdevice)); strcpy ( map_info[0].name, "US" ); strcpy ( map_info[0].proj, "STR/90;-105;0/nm" ); strcpy ( map_info[0].garea, "22.88;-120.49;46.02;-60.83" ); mapb.x[0] = 22.88;mapb.x[1]=46.02; mapb.y[0] = -120.49;mapb.y[1]=-60.83; mapindx = 0; draw_map(mapindx, map_info, 0, &mapb, &iret); return( 0 ); } /*NP*/ void gem_info_zoom_cb (Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* GEM_INFO_ZOOM_CB (LJH) */ /*************************************************************/ { static int zoom_state=0; int i, ityp, np, iret, mapindx=0; char sysin[2], sysout[2]; float xpts[2], ypts[2], xdev[2], ydev[2]; void mapw_pickstnCb(); if(zoom_state == 0) { zoom_state = 1; /* * Change mouse event handling for zooming */ XtRemoveEventHandler( gemlbl_station, ButtonPressMask, FALSE, mapw_pickstnCb, NULL); /* * change to the zoom cursor */ NxmCursorChange( gemlbl_station, XC_crosshair, "white"); XmUpdateDisplay( w ); ityp = 3; /* 2; */ np = 2; strcpy ( sysin, "D" ); for ( i = 0; i < np; i++) xpts[i] = ypts[i] = 0.0; ggtpnt( sysin, &ityp, xdev, ydev, &iret, strlen(sysin)); /* * check if the box is big enough */ if ( fabs(xdev[0] - xdev[1]) > 10 && fabs(ydev[0] - ydev[1]) > 10 ) { /* * Points need to be in lower-left, upper-right order */ if (xdev[0] > xdev[1]) { i = xdev[0]; xdev[0] = xdev[1]; xdev[1] = i; } if (ydev[0] < ydev[1]) { i = ydev[0]; ydev[0] = ydev[1]; ydev[1] = i; } strcpy ( sysout, "M" ); gtrans(sysin, sysout, &np, xdev, ydev, xpts, ypts, &iret, strlen(sysin), strlen(sysout)); if ( iret == 0 ) { for ( i = 0; i < np; i++) { mapb.x[i] = xpts[i]; mapb.y[i] = ypts[i]; } gclear(&iret); draw_map(mapindx, map_info, 1, &mapb, &iret); if (markSW) { get_gem_stns ( gemsoundfile, station_tbl, gemsoundtime, statlist, &nsta, sta_lat, sta_lon, sta_elev, &item_type, strlen (gemsoundfile), strlen (station_tbl), strlen (gemsoundtime)); map_mark ( &nsta, sta_lat, sta_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]; stnList.elv[i] = sta_elev[i]; strcpy ( stnList.stnName[i], statlist[i] ); } } } } /* * Reset the zoom button */ gem_info_zoom_cb( w, NULL, NULL); } else { zoom_state = 0; /* * restore default cursor */ NuiDefaultCursor( gemlbl_station ); /* * Restore mouse to be selection status */ XSelectInput( gemdisplay, XtWindow(gemlbl_station), ButtonPressMask | ButtonReleaseMask | ExposureMask ); XtAddEventHandler( gemlbl_station, ButtonPressMask, FALSE, mapw_pickstnCb, NULL ); } } /*NP*/ void gem_info_unzoom_cb (Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* GEM_INFO_UNZOOM_CB (LJH) */ /*************************************************************/ { int i, iret,mapindx=0; strcpy(map_info[0].name,"NWWRD1"); strcpy(map_info[0].proj, "CED/nm"); /* strcpy(map_info[0].garea, "-90;-180;90;180" ); mapb.x[0]=-90;mapb.x[1]=90; mapb.y[0]=-180;mapb.y[1]=180; */ strcpy(map_info[0].garea, "-90;60;90;60" ); mapb.x[0]=-90;mapb.x[1]=90; mapb.y[0]=60;mapb.y[1]=60; gclear(&iret); draw_map(mapindx, map_info, 0, &mapb, &iret); if (markSW) { get_gem_stns ( gemsoundfile, station_tbl, gemsoundtime, statlist, &nsta, sta_lat, sta_lon, sta_elev, &item_type, strlen (gemsoundfile), strlen (station_tbl), strlen (gemsoundtime)); map_mark ( &nsta, sta_lat, sta_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]; stnList.elv[i] = sta_elev[i]; strcpy ( stnList.stnName[i], statlist[i] ); } } } /*NP*/ void parcel_cancel_cb (Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* PARCEL_CANCEL_CB */ /*************************************************************/ { Widget wid = (Widget) client_data; XtUnmanageChild (wid); } /*NP*/ void show_about_info ( Widget w ) /***********************************************************/ /* SHOW_ABOUT_INFO */ /***********************************************************/ { char finam[200]; sprintf( finam, "nsharp.hlp"); printf( "Attempting to display contents of %s\n", finam); NxmHelp_loadFile(w, finam); /*NxmHelpLoadFile(finam);*/ } /*NP*/ void show_model_info ( Widget w ) /*************************************************************/ /* SHOW_MODEL_INFO */ /*************************************************************/ { static Widget mdlform, mdlform2, mdlpane, mdlfile_label, mdlsta_label, mdlfile_load, mdlfile_ok, mdlfile_cancel, mdlfile_help, mdltype_label, mdllbl_time, mdlfile_world, mdlfile_US, mdlfile_TROP_SFC, mdlfile_OFAGX, mdlfile_ATL, mdlfile_PAC, mdlfile_zoom, mdlfile_unzoom, mdllbl_station, mdlstn_opt; XmString str, str2, str3, str4, mdl_title; XmStringTable str_list; char *mdlouttext; /* char *stalist[] = { "ruc", "ruc2", "eta", "ngm", "meso", "avn" }; */ int i, num,iret,mapindx,ier; Dimension wdth,hght; char *gemouttext, gemdevice[72]; /* LJH add */ char path_work[80]; char *strp; char *str_type[20]; /* end add */ XrmValue value; if (XrmGetResource(g_applicationDB,"sharp95*lf_panel.paths", "Sharp95*lf_panel.Paths",str_type,&value) == True) { strncpy(path_work, value.addr, (int) value.size); strp = strtok (path_work,"+"); g_nummdls=0; while(g_nummdls < 7) { if (strp) { strcpy(g_mdllist[g_nummdls],strp); strp=strtok('\0',"+"); } else strcpy(g_mdllist[g_nummdls]," "); g_nummdls++; } } if ( ! mdl_dialog ) { /* Initialize g_mdllist */ /**************/ mdl_title = XmStringCreateLocalized( "Model Sounding Selection" ); mdl_dialog = XmCreateBulletinBoardDialog(toplevel, "mdl_panel", NULL, 0); XtVaSetValues( mdl_dialog, XmNdialogTitle, mdl_title, NULL); /* XmStringFree(mdl_title); */ mdlpane = XtVaCreateManagedWidget("parcel_pane", xmPanedWindowWidgetClass, mdl_dialog, XmNsashWidth, 1, XmNsashHeight, 1, NULL); mdlform = XtVaCreateWidget("form", xmFormWidgetClass, mdlpane, XmNfractionBase, 7, NULL ); str = XmStringCreateSimple ("GEMPAK Model file:"); mdlfile_label = XtVaCreateManagedWidget ("mdlfile_label", xmLabelWidgetClass, mdlform, XmNlabelString, str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL ); XmStringFree (str); /* LJH add */ strcpy(mdl_type, g_mdllist[0]); /* end */ mdlfile_text = XtVaCreateManagedWidget ("mdltext", xmTextWidgetClass, mdlform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, mdlfile_label, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL ); str = XmStringCreateSimple ("Model times:"); mdllbl_time = XtVaCreateManagedWidget ("mdlfile_time", xmLabelWidgetClass, mdlform, XmNlabelString, str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 2, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, XmNalignment, XmALIGNMENT_BEGINNING, NULL ); /* XmStringFree (str3); */ mdlfile_timelist = XmCreateScrolledList ( mdlform, "mdltimes", NULL, 0 ); /*XtVaSetValues ( mdlfile_timelist, XmNvisibleItemCount, 10, NULL );*/ XtVaSetValues (mdlfile_timelist, XmNselectionPolicy, XmEXTENDED_SELECT, XmNvisibleItemCount, 15, NULL ); XtVaSetValues (XtParent(mdlfile_timelist), XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, mdllbl_time, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, NULL ); /*XtAddCallback ( mdlfile_timelist, XmNbrowseSelectionCallback, mtime_select_cb, (XtPointer)1 );*/ XtAddCallback ( mdlfile_timelist, XmNextendedSelectionCallback, mtime_select_cb, NULL ); XtManageChild ( mdlfile_timelist ); str = XmStringCreateSimple ("Select Model:"); mdltype_label = XtVaCreateManagedWidget ("mdlfile_label", xmLabelWidgetClass, mdlform, XmNlabelString, str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 5, XmNtopAttachment, XmATTACH_FORM, NULL ); XmStringFree (str); /* num = XtNumber(stalist); */ num = XtNumber(g_mdllist); str_list = (XmStringTable) XtMalloc (num *sizeof (XmString *) ); for (i=0; i < num; i++) str_list[i] = XmStringCreateLocalized(g_mdllist[i]); mdlstn_opt = XmVaCreateSimpleOptionMenu ( mdlform, "mdlstn_opt", NULL, 'L', 0, modellist_cb, XmVaPUSHBUTTON, str_list[0], NULL, NULL, NULL, XmVaPUSHBUTTON, str_list[1], NULL, NULL, NULL, XmVaPUSHBUTTON, str_list[2], NULL, NULL, NULL, XmVaPUSHBUTTON, str_list[3], NULL, NULL, NULL, XmVaPUSHBUTTON, str_list[4], NULL, NULL, NULL, XmVaPUSHBUTTON, str_list[5], NULL, NULL, NULL, XmVaPUSHBUTTON, str_list[6], NULL, NULL, NULL, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 5, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, mdltype_label, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 6, NULL ); for ( i=0; i < num; i++ ) XmStringFree ( str_list[i] ); XtFree ( (XtPointer)str_list ); XtManageChild ( mdlstn_opt ); str = XmStringCreateSimple ("Location:"); mdlfile_label = XtVaCreateManagedWidget ("mdlfile_label", xmLabelWidgetClass, mdlform, XmNlabelString, str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, mdlfile_text, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 1, XmNalignment, XmALIGNMENT_END, NULL ); XmStringFree (str); mdl_statext = XtVaCreateManagedWidget ("mdl_statext", xmTextWidgetClass, mdlform, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget, mdlfile_label, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, mdlfile_text, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, XmNcolumns, 12, NULL ); XtAddCallback ( mdl_statext, XmNvalueChangedCallback, set_mdlsta, NULL ); XtAddCallback ( mdl_statext, XmNactivateCallback, load_mdldata, NULL ); gemlbl_station2 = XtVaCreateManagedWidget("map2", xmDrawingAreaWidgetClass, mdlform, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, mdl_statext, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget,XtParent(mdlfile_timelist), XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNwidth, 500, XmNbackground, pixels[0], NULL); XtAddCallback( gemlbl_station2, XmNexposeCallback, mapw_exposeCb, NULL ); XtAddEventHandler( gemlbl_station2, ButtonPressMask, FALSE, GetSoundingForLatLon, NULL ); XtAddEventHandler( gemlbl_station2, PointerMotionMask, FALSE, (XtEventHandler)mdlmap_pointer, (XtPointer)NULL); /* HERE */ XtManageChild ( mdlform ); XtVaGetValues(gemlbl_station2, XmNwidth, &wdth, XmNheight, &hght, NULL); mdlform2 = XtVaCreateWidget("form", xmFormWidgetClass, mdlpane, XmNfractionBase, 10, XmNwidth, 980, XmNheight, 60, NULL ); mdl_cursor_text = XtVaCreateManagedWidget ("mdl_cursor_text", xmTextFieldWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 6, /*XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 1, */ XmNwidth, 150, NULL ); /*left pos 0 to 5 */ mdlfile_cancel = XtVaCreateManagedWidget ("CANCEL", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 2, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 3, NULL ); XtAddCallback(mdlfile_cancel, XmNactivateCallback, (XtCallbackProc)mdl_info_cancel_cb, NULL); mdlfile_world = XtVaCreateManagedWidget ("WORLD", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 3, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 5, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL ); XtAddCallback(mdlfile_world, XmNactivateCallback, (XtCallbackProc)mdl_info_world_cb, NULL); mdlfile_US = XtVaCreateManagedWidget ("U.S.", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 3, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 5, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL ); XtAddCallback(mdlfile_US, XmNactivateCallback, (XtCallbackProc)mdl_info_US_cb, NULL); mdlfile_TROP_SFC = XtVaCreateManagedWidget ("TROPSFC", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 5, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 5, NULL ); XtAddCallback(mdlfile_TROP_SFC, XmNactivateCallback, (XtCallbackProc)mdl_info_TROP_SFC_cb, NULL); mdlfile_OFAGX = XtVaCreateManagedWidget ("OFAGX", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 5, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_POSITION, XmNbottomPosition, 5, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 6, NULL ); XtAddCallback(mdlfile_OFAGX, XmNactivateCallback, (XtCallbackProc)mdl_info_OFAGX_cb, NULL); mdlfile_ATL = XtVaCreateManagedWidget ("ATLANTIC", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 5, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 5, NULL ); XtAddCallback(mdlfile_ATL, XmNactivateCallback, (XtCallbackProc)mdl_info_ATL_cb, NULL); mdlfile_PAC = XtVaCreateManagedWidget ("PACIFIC", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 5, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 5, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 6, NULL ); XtAddCallback(mdlfile_PAC, XmNactivateCallback, (XtCallbackProc)mdl_info_PAC_cb, NULL); /* Offset everything below by 2 more */ mdlfile_zoom = XtVaCreateManagedWidget ("ZOOM", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 7, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 8, NULL ); XtAddCallback(mdlfile_zoom, XmNactivateCallback, (XtCallbackProc)mdl_info_zoom_cb, NULL); mdlfile_unzoom = XtVaCreateManagedWidget ("UNZOOM", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 8, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 9, NULL ); XtAddCallback(mdlfile_unzoom, XmNactivateCallback, (XtCallbackProc)mdl_info_unzoom_cb, NULL); mdlfile_help = XtVaCreateManagedWidget ("HELP", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 9, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 10, NULL ); XtManageChild ( mdlform2 ); XtManageChild ( mdlpane ); XtManageChild ( mdl_dialog ); model_mapw_rgstr( gemlbl_station2 ); XtVaGetValues ( mdlfile_text, XmNvalue, &mdlouttext, NULL ); if ( mdlouttext != NULL ) { strcpy ( mdlsoundfile, mdlouttext ); get_mdl_times ( mdlsoundfile, mtime_list, &mtimes, strlen(mdlsoundfile) ); mdlsoundtime[0] = '\0'; str_list = (XmStringTable) XtMalloc (mtimes * sizeof (XmString) ); for ( i=0; i < mtimes; i++ ) { /* mtime_list[i][18] = 0; ??? */ str_list[i] = XmStringCreateLocalized (mtime_list[-i]); } XtVaSetValues ( mdlfile_timelist, XmNitems, str_list, XmNitemCount, mtimes, NULL ); for ( i=0; i < mtimes; i++ ) XmStringFree ( str_list[i] ); XtFree ( (XtPointer)str_list ); } XtFree ( mdlouttext ); mdl_info_US_cb(gemlbl_station2,(XtPointer) NULL, (XtPointer) NULL); } else { draw_model_map(); if (g_lastmodelPFS) { /* load_mdl_times(); */ XmListDeselectAllItems(mdlfile_timelist); g_lastmodelPFS=0; } else { map_mark ( &nsta, &g_lat, &g_lng, NULL, &ncolor, NULL, &jcolr, &mrktyp, &sizmrk, &mrkwid, &pltval, &iposn, &iret ); } } XtManageChild ( mdl_dialog ); strcpy(gemdevice, "maptop2"); gslwin(gemdevice, &iret, strlen(gemdevice)); } void show_pfs_model_info (Widget w) { static Widget mdlform,mdlfile_label,mdlpane,mdlform2,mdlfile_cancel,mdlstn_opt, mdllbl_time,mdltype_label,mdlfile_zoom,mdlfile_unzoom,mdlfile_NAmerica, mdlfile_US; XmString str,str2,str3,str4,mdl_title; int i, num,iret,mapindx,ier; Dimension wdth,hght; XmStringTable str_list; char *gemouttext,gemdevice[72]; /* LJH add */ char path_work[80]; char *strp; char *str_type[20]; char *mdlouttext; char gemmodelstring[80]; /* end add */ XrmValue value; g_pfs_model_sel_sw=-1; g_lastmodelPFS=-1; if (XrmGetResource(g_applicationDB,"sharp95*lf_pfs_panel.paths", "Sharp95*lf_pfs_panel.Paths",str_type,&value) == True) { strncpy(path_work, value.addr, (int) value.size); strp = strtok (path_work,"+"); g_nummdls=0; while(g_nummdls < 7) { if (strp) { strcpy(g_mdllist[g_nummdls],strp); strp=strtok('\0',"+"); } else strcpy(g_mdllist[g_nummdls]," "); g_nummdls++; } } if ( ! pfs_mdl_dialog ) { /* Initialize g_mdllist */ /**************/ mdl_title = XmStringCreateLocalized( "Model Point Fcst Sounding Selection" ); pfs_mdl_dialog = XmCreateBulletinBoardDialog(toplevel, "pfsmdl_panel", NULL, 0); XtVaSetValues( pfs_mdl_dialog, XmNdialogTitle, mdl_title, NULL); /* XmStringFree(mdl_title); */ mdlpane = XtVaCreateManagedWidget("parcel_pane", xmPanedWindowWidgetClass, pfs_mdl_dialog, XmNsashWidth, 1, XmNsashHeight, 1, NULL); mdlform = XtVaCreateWidget("form", xmFormWidgetClass, mdlpane, XmNfractionBase, 7, NULL ); str = XmStringCreateSimple ("GEMPAK PFS Model file:"); mdlfile_label = XtVaCreateManagedWidget ("pfsmdlfile_label", xmLabelWidgetClass, mdlform, XmNlabelString, str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL ); XmStringFree (str); /* LJH add */ strcpy(mdl_type, g_pfsmdllist[0]); /* end */ mdlfile_text = XtVaCreateManagedWidget ("mdltext", xmTextWidgetClass, mdlform, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, mdlfile_label, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 4, NULL ); str = XmStringCreateSimple ("Model times:"); mdllbl_time = XtVaCreateManagedWidget ("mdlfile_time", xmLabelWidgetClass, mdlform, XmNlabelString, str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 2, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, XmNalignment, XmALIGNMENT_BEGINNING, NULL ); /* XmStringFree (str3); */ pfsmdlfile_timelist = XmCreateScrolledList ( mdlform, "mdltimes", NULL, 0 ); /*XtVaSetValues ( mdlfile_timelist, XmNvisibleItemCount, 10, NULL );*/ XtVaSetValues (pfsmdlfile_timelist, XmNselectionPolicy, XmEXTENDED_SELECT, XmNvisibleItemCount, 15, NULL ); XtVaSetValues (XtParent(pfsmdlfile_timelist), XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, mdllbl_time, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 2, NULL ); /*XtAddCallback ( mdlfile_timelist, XmNbrowseSelectionCallback, mtime_select_cb, (XtPointer)1 );*/ XtAddCallback ( pfsmdlfile_timelist, XmNextendedSelectionCallback, pfsmtime_select_cb, NULL ); XtManageChild ( pfsmdlfile_timelist ); str = XmStringCreateSimple ("Select Model:"); mdltype_label = XtVaCreateManagedWidget ("mdlfile_label", xmLabelWidgetClass, mdlform, XmNlabelString, str, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 5, XmNtopAttachment, XmATTACH_FORM, NULL ); XmStringFree (str); /* num = XtNumber(stalist); */ num = XtNumber(g_mdllist); str_list = (XmStringTable) XtMalloc (num *sizeof (XmString *) ); for (i=0; i < num; i++) str_list[i] = XmStringCreateLocalized(g_mdllist[i]); mdlstn_opt = XmVaCreateSimpleOptionMenu ( mdlform, "mdlstn_opt", NULL, 'L', 0, modellist_cb, XmVaPUSHBUTTON, str_list[0], NULL, NULL, NULL, XmVaPUSHBUTTON, str_list[1], NULL, NULL, NULL, XmVaPUSHBUTTON, str_list[2], NULL, NULL, NULL, XmVaPUSHBUTTON, str_list[3], NULL, NULL, NULL, XmVaPUSHBUTTON, str_list[4], NULL, NULL, NULL, XmVaPUSHBUTTON, str_list[5], NULL, NULL, NULL, XmVaPUSHBUTTON, str_list[6], NULL, NULL, NULL, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 5, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, mdltype_label, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 6, NULL ); for ( i=0; i < num; i++ ) XmStringFree ( str_list[i] ); XtFree ( (XtPointer)str_list ); XtManageChild (mdlstn_opt); gemlbl_station3 = XtVaCreateManagedWidget("map3", xmDrawingAreaWidgetClass, mdlform, XmNtopAttachment, XmATTACH_WIDGET, XmNtopWidget, mdlstn_opt, XmNleftAttachment, XmATTACH_WIDGET, XmNleftWidget,XtParent(pfsmdlfile_timelist), XmNrightAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNwidth, 500, XmNbackground, pixels[0], NULL); XtAddCallback( gemlbl_station3, XmNexposeCallback, mapw_exposeCb, NULL ); XtAddEventHandler( gemlbl_station3, ButtonPressMask, FALSE, mapw_pickstnCb, NULL); XtManageChild(mdlform); XtVaGetValues(gemlbl_station3, XmNwidth, &wdth, XmNheight, &hght, NULL); mdlform2 = XtVaCreateWidget("form", xmFormWidgetClass, mdlpane, XmNfractionBase, 10, XmNwidth, 980, XmNheight, 60, NULL ); mdlfile_cancel = XtVaCreateManagedWidget ("CANCEL", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 2, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 3, NULL ); XtAddCallback(mdlfile_cancel, XmNactivateCallback, (XtCallbackProc)pfs_mdl_info_cancel_cb, NULL); mdlfile_NAmerica = XtVaCreateManagedWidget("North\nAmerica", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 5, NULL ); XtAddCallback(mdlfile_NAmerica, XmNactivateCallback, (XtCallbackProc)pfs_mdl_info_unzoom_cb, NULL); mdlfile_US = XtVaCreateManagedWidget("U.S.", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 5, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 6, NULL ); XtAddCallback(mdlfile_US, XmNactivateCallback, (XtCallbackProc)pfs_mdl_info_US_cb, NULL); mdlfile_zoom = XtVaCreateManagedWidget("ZOOM", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 7, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 8, NULL ); XtAddCallback(mdlfile_zoom, XmNactivateCallback, (XtCallbackProc)pfs_mdl_info_zoom_cb, NULL); mdlfile_unzoom = XtVaCreateManagedWidget("UNZOOM", xmPushButtonWidgetClass, mdlform2, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 8, XmNtopAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 9, NULL ); XtAddCallback(mdlfile_unzoom, XmNactivateCallback, (XtCallbackProc)pfs_mdl_info_unzoom_cb, NULL); XtManageChild(mdlform2); XtManageChild(mdlpane); XtManageChild(pfs_mdl_dialog); pfs_model_mapw_rgstr(gemlbl_station3); } else { strcpy(gemdevice,"maptop3"); gslwin(gemdevice,&iret,strlen(gemdevice)); XtManageChild(pfs_mdl_dialog); } } /*NP*/ void pfs_mdl_info_cancel_cb (Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* MDL_INFO_CANCEL_CB */ /*************************************************************/ { XtUnmanageChild (pfs_mdl_dialog); } /*NP*/ void pfs_mdl_info_zoom_cb (Widget w, XtPointer client_data, XtPointer call_data) { static int zoom_state = 0; int i, ityp, np, iret, mapindx=0; char sysin[2], sysout[2]; float xpts[2], ypts[2], xdev[2], ydev[2]; void mapw_pickstnCb(); if(zoom_state == 0) { zoom_state = 1; /* * Change mouse event handling for zooming */ XtRemoveEventHandler( gemlbl_station3, ButtonPressMask, FALSE, mapw_pickstnCb, NULL); /* * change to the zoom cursor */ NxmCursorChange( gemlbl_station3, XC_crosshair, "white"); XmUpdateDisplay( w ); ityp = 3; /* 2; */ np = 2; strcpy ( sysin, "D" ); for ( i = 0; i < np; i++) xpts[i] = ypts[i] = 0.0; ggtpnt( sysin, &ityp, xdev, ydev, &iret, strlen(sysin)); /* * check if the box is big enough */ if ( fabs(xdev[0] - xdev[1]) > 10 && fabs(ydev[0] - ydev[1]) > 10 ) { /* * Points need to be in lower-left, upper-right order */ if (xdev[0] > xdev[1]) { i = xdev[0]; xdev[0] = xdev[1]; xdev[1] = i; } if (ydev[0] < ydev[1]) { i = ydev[0]; ydev[0] = ydev[1]; ydev[1] = i; } strcpy ( sysout, "M" ); gtrans(sysin, sysout, &np, xdev, ydev, xpts, ypts, &iret, strlen(sysin), strlen(sysout)); if ( iret == 0 ) { for ( i = 0; i < np; i++) { mapb.x[i] = xpts[i]; mapb.y[i] = ypts[i]; } gclear(&iret); draw_map(mapindx, map_info, 1, &mapb, &iret); g_pfs_mapset=-1; if (markSW) { Load_PFS_stationlist(g_pfs_mapset); } } } /* * Reset the zoom button */ pfs_mdl_info_zoom_cb( w, NULL, NULL); } else { zoom_state = 0; /* * restore default cursor */ NuiDefaultCursor( gemlbl_station3 ); /* * Restore mouse to be selection status */ XSelectInput( gemdisplay, XtWindow(gemlbl_station3), ButtonPressMask | ButtonReleaseMask | ExposureMask ); XtAddEventHandler( gemlbl_station3, ButtonPressMask, FALSE, mapw_pickstnCb, NULL ); } } void pfs_mdl_info_US_cb (Widget w, XtPointer client_data, XtPointer call_data) { int i, iret,mapindx=0; strcpy ( map_info[0].name, "US" ); strcpy ( map_info[0].proj, "STR/90;-105;0/nm" ); strcpy ( map_info[0].garea, "22.88;-120.49;46.02;-60.83" ); mapb.x[0] = 22.88;mapb.x[1]=46.02; mapb.y[0] = -120.49;mapb.y[1]=-60.83; gclear(&iret); draw_map(mapindx, map_info, 0, &mapb, &iret); g_pfs_mapset=-1; if (markSW) { Load_PFS_stationlist(g_pfs_mapset); } } void pfs_mdl_info_unzoom_cb (Widget w, XtPointer client_data, XtPointer call_data) { int i, iret,mapindx=0; strcpy(map_info[0].name,"LLVL2"); strcpy(map_info[0].proj, "STR/90;-97;0/0;0;0;0"); strcpy(map_info[0].garea, "5;-125;46;-32.5" ); mapb.x[0]=5;mapb.x[1]=46; mapb.y[0]=-125;mapb.y[1]=-32.5; gclear(&iret); draw_map(mapindx, map_info, 0, &mapb, &iret); g_pfs_mapset=-1; if (markSW) { Load_PFS_stationlist(g_pfs_mapset); } } /*NP*/ void draw_model_map() /*****************************************************************/ /* DRAW_MODEL_MAP */ /*****************************************************************/ { int iret, mapindx=0; char gemdevice[72]; if (g_allModelParamsSW || g_pfs_model_sel_sw) { if (g_pfs_model_sel_sw) strcpy(gemdevice,"maptop3"); else strcpy(gemdevice,"maptop2"); gslwin(gemdevice, &iret, strlen(gemdevice)); map_init(&iret, gemdevice, strlen(gemdevice)); if (! g_WorldProj && g_Proj<=1) { strcpy ( map_info[0].name, "US" ); strcpy ( map_info[0].proj, "STR/90;-105;0/nm" ); strcpy ( map_info[0].garea, "22.88;-120.49;46.02;-60.83" ); mapb.x[0] = 22.88;mapb.x[1]=46.02; mapb.y[0] = -120.49;mapb.y[1]=-60.83; /* gclear(&iret); */ draw_map(mapindx, map_info, 0, &mapb, &iret); } else { /* gclear(&iret); */ draw_map(mapindx, map_info, 1, &mapb, &iret); } } } /*NP*/ model_mapw_rgstr(mapwin) Widget mapwin; /************************************************************************ * model_mapw_rgstr * * * * This routine will initiliaze the GEMPAK display variables and * * register the map drawing area into a GEMPAK window. * * * * model_mapw_rgstr ( mapwin ) * * * * Input parameters: * * mapwin Widget The map drawing area widget * * * * Return code: * * 0 -- Successful. * * -1 -- Error. * ** * ***********************************************************************/ { XColor cred; Dimension wdth, hght; /*struct maptype_list map_info[2]; mapbnd_t mapb;*/ Window gwin; GC gemgc; Cursor curs; int xwdth, xhght, xdpth; int iret, mapindx=0; char gemdevice[72]; /*---------------------------------------------------------------------*/ /* * Get the map window geometry. */ XtVaGetValues(mapwin, XmNwidth, &wdth, XmNheight, &hght, NULL); xwdth = (int)wdth; xhght = (int)hght; xdpth = DefaultDepthOfScreen(XtScreen(mapwin)); /* * Set the window and graphics context. */ gwin = XtWindow(mapwin); gemgc = XCreateGC(gemdisplay, gwin, 0, 0); /* * Create a red arrow for the cursor. */ curs = XCreateFontCursor(gemdisplay, XC_top_left_arrow); XDefineCursor(gemdisplay, gwin, curs); cred.red = 65535; cred.blue = 0; cred.green = 0; cred.flags = DoRed | DoBlue | DoGreen; XRecolorCursor(gemdisplay, curs, &cred, &cred); /* * Set the fill rule. */ XSetFillRule(gemdisplay, gemgc, WindingRule); /* * Register the map window */ strcpy(gemdevice,"maptop2"); xmotifw(gwin, gemdevice, gemgc, xwdth, xhght, xdpth, &iret); if( iret != 0 ) return( iret ); /* * Draw the US map. FORTRAN function map_init() */ map_init(&iret, gemdevice, strlen(gemdevice)); if (! g_WorldProj && g_Proj<=1) { strcpy ( map_info[0].name, "US" ); strcpy ( map_info[0].proj, "STR/90;-105;0/nm" ); strcpy ( map_info[0].garea, "22.88;-120.49;46.02;-60.83" ); mapb.x[0] = 22.88;mapb.x[1]=46.02; mapb.y[0] = -120.49;mapb.y[1]=-60.83; mapindx = 0; } draw_map(mapindx, map_info, 0, &mapb, &iret); return( 0 ); } /*NP*/ pfs_model_mapw_rgstr(Widget mapwin) /************************************************************************ * model_pdsmapw_rgstr * * * * This routine will initiliaze the GEMPAK display variables and * * register the map drawing area into a GEMPAK window. * * * * model_mapw_rgstr ( mapwin ) * * * * Input parameters: * * mapwin Widget The map drawing area widget * * * * Return code: * * 0 -- Successful. * * -1 -- Error. * ** * ***********************************************************************/ { XColor cred; Dimension wdth, hght; /*struct maptype_list map_info[2]; mapbnd_t mapb;*/ Window gwin; GC gemgc; Cursor curs; int xwdth, xhght, xdpth; int iret, mapindx=0; char gemdevice[72]; /*---------------------------------------------------------------------*/ /* * Get the map window geometry. */ XtVaGetValues(mapwin, XmNwidth, &wdth, XmNheight, &hght, NULL); xwdth = (int)wdth; xhght = (int)hght; xdpth = DefaultDepthOfScreen(XtScreen(mapwin)); /* * Set the window and graphics context. */ gwin = XtWindow(mapwin); gemgc = XCreateGC(gemdisplay, gwin, 0, 0); /* * Create a red arrow for the cursor. */ curs = XCreateFontCursor(gemdisplay, XC_top_left_arrow); XDefineCursor(gemdisplay, gwin, curs); cred.red = 65535; cred.blue = 0; cred.green = 0; cred.flags = DoRed | DoBlue | DoGreen; XRecolorCursor(gemdisplay, curs, &cred, &cred); /* * Set the fill rule. */ XSetFillRule(gemdisplay, gemgc, WindingRule); /* * Register the map window */ strcpy(gemdevice,"maptop3"); xmotifw(gwin, gemdevice, gemgc, xwdth, xhght, xdpth, &iret); if( iret != 0 ) return( iret ); /* * Draw the US map. FORTRAN function map_init() */ map_init(&iret, gemdevice, strlen(gemdevice)); if (! g_WorldProj && g_Proj<=1) { strcpy ( map_info[0].name, "US" ); strcpy ( map_info[0].proj, "STR/90;-105;0/nm" ); strcpy ( map_info[0].garea, "22.88;-120.49;46.02;-60.83" ); mapb.x[0] = 22.88;mapb.x[1]=46.02; mapb.y[0] = -120.49;mapb.y[1]=-60.83; mapindx = 0; } draw_map(mapindx, map_info, 0, &mapb, &iret); return( 0 ); } /*NP*/ void GetSoundingForLatLon(mapwin, client_data, event ) /*************************************************************/ /* GETSOUNDINGFORLATLON */ /*************************************************************/ Widget mapwin; XtPointer client_data; XEvent *event; { char gemdevice[72]; int mapindx=0; int np,iret; float lat,lon,xloc,yloc; static long count=0; char sys1[2]; char sys2[2]; static char lastModelSoundTime[200]; strcpy(sys1,"D"); strcpy(sys2,"M"); if ((event->xbutton.button == 1) || (event->xbutton.button == 2) || (event->xbutton.button == 3)) { if (count==0 && g_allModelParamsSW) { /* Redraw Map - Temp fix to coordinate trans */ g_mlocationSelected=-1; /* * Draw the US map. FORTRAN function map_init() */ strcpy(gemdevice,"maptop2"); map_init(&iret, gemdevice, strlen(gemdevice)); draw_map(mapindx, map_info, 1, &mapb, &iret); /*count++;*/ } xloc=(float) event->xbutton.x; yloc=(float) event->xbutton.y; np=1; gtrans( sys1, sys2, &np, &xloc, &yloc, &lat, &lon, &iret, strlen(sys1), strlen(sys2) ); if(g_allModelParamsSW) { sprintf(mdlsoundsta,"%s","ZZZ"); g_lng=lon;g_lat=lat; ncolor = 1; mrktyp = 6; sizmrk = 1.0; mrkwid = 2; pltval = G_FALSE; iposn = 0; jcolr = 2; nsta=1; map_mark ( &nsta, &g_lat, &g_lng, NULL, &ncolor, NULL, &jcolr, &mrktyp, &sizmrk, &mrkwid, &pltval, &iposn, &iret ); if (mdlsoundtime[0] == '\0') strcpy(mdlsoundtime,lastModelSoundTime); else strcpy(lastModelSoundTime,mdlsoundtime); Load_mdl_sounding(); } } } /*NP*/ void mdlmap_pointer(Widget w, XtPointer *call_data, XEvent *event) /*************************************************************/ /* POINTER_UPDATE */ /* */ /* Handles "mouse moved w/ no buttons" event */ /*************************************************************/ { char sysin[3],sysout[3],cursor_pos[81]; float xdev,ydev,lat,lon; int iret,np=1; xdev = (float) event->xbutton.x; ydev = (float) event->xbutton.y; strcpy ( sysin, "D" ); strcpy ( sysout, "M" ); gtrans(sysin, sysout, &np, &xdev, &ydev, &lat, &lon, &iret, strlen(sysin), strlen(sysout)); cursor_pos[0] = '\0'; sprintf(cursor_pos,"%6.2f,%7.2f\0",lat,lon); XtVaSetValues ( mdl_cursor_text, XmNvalue, cursor_pos, NULL ); XFlush (XtDisplay(gemlbl_station2)); } /*NP*/ void modellist_cb (Widget w, XtPointer client_data, XtPointer call_data) /*************************************************************/ /* MODELLIST_CB */ /*************************************************************/ { int item_no = (int) client_data; static Widget load_filemdl; char *file_dir, directory[200], pattern[200]; XmString directory_str, pattern_str; /* LJH add */ static Widget lffile_list, lfpane, lfform, lfform2, lf_ok, lf_cancel; XmString lf_title; char file_dir_work[80]; char *str_type[20]; XrmValue value; char ext_work[80]; char mdlpattern[7][10]; char *strp; int nummdls; int fhrpos; char searchfcstchar; int mfcountisshr=-1; int i; char lf_mdllistrunhr [50][80]; /***********/ if ( ! lf_dialog ) { lf_title= XmStringCreateLocalized("Model Data Selection"); lf_dialog=XmCreateBulletinBoardDialog(toplevel, "lf_panel", NULL, 0); XtVaSetValues( lf_dialog, XmNdialogTitle, lf_title, NULL); lfpane = XtVaCreateManagedWidget("listing_file_pane", xmPanedWindowWidgetClass, lf_dialog, XmNsashWidth, 1, XmNsashHeight, 1, NULL); lfform = XtVaCreateWidget("form",xmFormWidgetClass, lfpane, XmNfractionBase, 3, NULL); lffile_list = XmCreateScrolledList(lfform,"lftimes",NULL,0); XtVaSetValues(lffile_list,XmNvisibleItemCount,10, NULL); lfform2 = XtVaCreateWidget("form",xmFormWidgetClass,lfpane, XmNfractionBase,3, NULL); /* lf_ok = XtVaCreateManagedWidget("OK", xmPushButtonWidgetClass, lfform2,XmNleftAttachment,XmATTACH_FORM,XmNrightAttachment, XmATTACH_POSITION,XmNrightPosition, 1, NULL); */ lf_cancel = XtVaCreateManagedWidget("CANCEL", xmPushButtonWidgetClass, lfform2,XmNleftAttachment,XmATTACH_POSITION,XmNleftPosition, 1, XmNrightAttachment,XmATTACH_POSITION,XmNrightPosition, 2, /* XmNrightAttachment, XmATTACH_FORM, */ NULL); XtAddCallback(lffile_list, XmNbrowseSelectionCallback, lf_loadmdlfiles_cb, NULL); /* XtAddCallback(lf_ok, XmNactivateCallback, (XtCallbackProc) lf_loadmdlfiles_cb, NULL);*/ XtAddCallback(lf_cancel, XmNactivateCallback, (XtCallbackProc) lf_cancel_cb, NULL); } XtManageChild(lffile_list); XtManageChild(lfform); XtManageChild(lfform2); XtManageChild(lfpane); XtManageChild(lf_dialog); /* Choose Loading based on g_pfs_model_sel_sw */ if (g_pfs_model_sel_sw) { /*LJH alter...Obtain file_directory from lf_panel.dir resource */ if (XrmGetResource(g_applicationDB,"sharp95*lf_pfs_panel.dir", "Sharp95*lf_pfs_panel.Dir",str_type,&value) == True) { strncpy(file_dir_work,value.addr,(int) value.size); file_dir=file_dir_work; } else file_dir = NULL; if (XrmGetResource(g_applicationDB,"sharp95*lf_pfs_panel.patterns", "Sharp95*lf_pfs_panel.Patterns",str_type,&value) == True) { strncpy(ext_work,value.addr,(int) value.size); strp=strtok(ext_work,"+"); nummdls=0; while (nummdls < 7) { if (strp) { strcpy(mdlpattern[nummdls],strp); strp=strtok('\0',"+"); } else strcpy(mdlpattern[nummdls],""); nummdls++; } } sprintf(directory,"%s",file_dir); sprintf(pattern,g_mdllist[item_no]); sprintf(g_pattern,mdlpattern[item_no]); sprintf(mdl_selected,g_mdllist[item_no]); for (i=0;i 0) { mfcountisshr=0; strcpy(lf_mdllistrunhr[mfcountisshr],g_mdlfiles[0]->d_name); /* free(g_mdlfiles[0]); */ for (i=1;id_name); } /* free(g_mdlfiles); */ } /* List complete...load to lffile_list */ XmListDeleteAllItems(lffile_list); for (i=mfcountisshr;i>=0;i--) { AppendMdlFileToList(lffile_list, lf_mdllistrunhr[i]); } } else { /*LJH alter...Obtain file_directory from lf_panel.dir resource */ if (XrmGetResource(g_applicationDB,"sharp95*lf_panel.dir", "Sharp95*lf_panel.Dir",str_type,&value) == True) { strncpy(file_dir_work,value.addr,(int) value.size); file_dir=file_dir_work; } else file_dir = NULL; if (XrmGetResource(g_applicationDB,"sharp95*lf_panel.patterns", "Sharp95*lf_panel.Patterns",str_type,&value) == True) { strncpy(ext_work,value.addr,(int) value.size); strp=strtok(ext_work,"+"); nummdls=0; while (nummdls < 7) { if (strp) { strcpy(mdlpattern[nummdls],strp); strp=strtok('\0',"+"); } else strcpy(mdlpattern[nummdls],""); nummdls++; } } sprintf(directory,"%s",file_dir); sprintf(pattern,g_mdllist[item_no]); sprintf(g_pattern,mdlpattern[item_no]); sprintf(mdl_selected,g_mdllist[item_no]); for (i=0;i 0) { mfcountisshr=0; strcpy(lf_mdllistrunhr[mfcountisshr],g_mdlfiles[0]->d_name); /* free(g_mdlfiles[0]); */ for (i=1;id_name,'f')!=NULL) ? 'f' : 'F'; fhrpos=(strchr(g_mdlfiles[i]->d_name,searchfcstchar)-(g_mdlfiles[i]->d_name)); if (strncmp(g_mdlfiles[i]->d_name,lf_mdllistrunhr[mfcountisshr],fhrpos) != 0) { mfcountisshr++; strcpy(lf_mdllistrunhr[mfcountisshr],g_mdlfiles[i]->d_name); } /* free(g_mdlfiles[i]); */ } /* free(g_mdlfiles); */ } /* List complete...load to lffile_list */ XmListDeleteAllItems(lffile_list); for (i=mfcountisshr;i>=0;i--) { AppendMdlFileToList(lffile_list, lf_mdllistrunhr[i]); } } } void lf_loadmdlfiles_cb (Widget w, XtPointer client_data, XtPointer call_data ) { struct dirent **mdlfiles; XmListCallbackStruct* ptr; char *string; char datestring[20]; int count=0,i; char *buf; char date[9],runhr[5],time[4]; int iret,mapindx=0; char gemdevice[72]; char *str_type[20]; XrmValue value; char parsestring[80]; char searchfcstchar; int fhrpos; char gemmodelstring[80]; XmStringTable str_list = NULL; int ncnt=0; ptr=(XmListCallbackStruct*) call_data; XmStringGetLtoR(ptr->item, XmSTRING_DEFAULT_CHARSET, &string); parsestring[0]='\0'; if (g_pfs_model_sel_sw) { /*PFS model file handling...a lot different than regular files*/ /*Build a list of times */ strcpy ( g_pfs_mdlsoundfile, string ); XtFree(string); load_pfs_times(); XtUnmanageChild(lf_dialog); /**************/ } else { if (XrmGetResource(g_applicationDB,"nsharp*lf_panel.parsestrng", "Sharp95*lf_panel.Parsestring",str_type,&value) == True) strncpy(parsestring,value.addr,(int) value.size); strcpy ( mdlsoundfile, string ); XtFree(string); /* load_mdl_times(); */ sprintf(gemmodelstring,"%s/%s",g_pathname,mdlsoundfile); XtVaSetValues(mdlfile_text, XmNvalue, gemmodelstring, NULL); /*****/ searchfcstchar = (strchr(mdlsoundfile,'f')!=NULL) ? 'f' : 'F'; fhrpos=(strchr(mdlsoundfile,searchfcstchar)-mdlsoundfile); strncpy(datestring,mdlsoundfile,fhrpos); datestring[fhrpos]='\0'; /* count=scandir(g_pathname, &mdlfiles, file_select, alphasort); */ XmListDeleteAllItems(mdlfile_timelist); mtimes=0; for (i=0;id_name,datestring)) != NULL) { /* printf("files...%s\n",g_mdlfiles[i]->d_name); */ AppendMdlFileToList(mdlfile_timelist, g_mdlfiles[i]->d_name); strcpy(mtime_list[mtimes],g_mdlfiles[i]->d_name); if (parsestring[0]=='\0') { if (sscanf(g_mdlfiles[i]->d_name, "%*2s%6s%*[_]%2s%*[f]%2s",date,runhr,time) < 3) { sscanf(g_mdlfiles[i]->d_name,"%*2s%6s%2s%*[f]%2s",date,runhr,time); } } else sscanf(g_mdlfiles[i]->d_name,parsestring,date,runhr,time); sprintf(mdlsoundtime,"%s/%s00F0%2s\0",date,runhr,time); strcpy(mtimeac_list[mtimes],mdlsoundtime); mtimes++; } /* free(mdlfiles[i]); */ } XtUnmanageChild(lf_dialog); } } void load_mdl_times() { int i; char *buf; char date[9],runhr[5],time[4]; int iret,mapindx=0; char datestring[20]; char *str_type[20]; XrmValue value; char parsestring[80]; char searchfcstchar; int fhrpos; char gemmodelstring[80]; XmStringTable str_list = NULL; int ncnt=0; if (XrmGetResource(g_applicationDB,"nsharp*lf_panel.parsestrng", "Sharp95*lf_panel.Parsestring",str_type,&value) == True) strncpy(parsestring,value.addr,(int) value.size); sprintf(gemmodelstring,"%s/%s",g_pathname,mdlsoundfile); XtVaSetValues(mdlfile_text, XmNvalue, gemmodelstring, NULL); searchfcstchar = (strchr(mdlsoundfile,'f')!=NULL) ? 'f' : 'F'; fhrpos=(strchr(mdlsoundfile,searchfcstchar)-mdlsoundfile); strncpy(datestring,mdlsoundfile,fhrpos); datestring[fhrpos]='\0'; mtimes=0; for (i=0;id_name,datestring)) != NULL) { /* printf("files...%s\n",g_mdlfiles[i]->d_name); */ AppendMdlFileToList(mdlfile_timelist, g_mdlfiles[i]->d_name); strcpy(mtime_list[mtimes],g_mdlfiles[i]->d_name); if (parsestring[0]=='\0') { if (sscanf(g_mdlfiles[i]->d_name, "%*2s%6s%*[_]%2s%*[f]%2s",date,runhr,time) < 3) { sscanf(g_mdlfiles[i]->d_name,"%*2s%6s%2s%*[f]%2s",date,runhr,time); } } else sscanf(g_mdlfiles[i]->d_name,parsestring,date,runhr,time); sprintf(mdlsoundtime,"%s/%s00F0%2s\0",date,runhr,time); strcpy(mtimeac_list[mtimes],mdlsoundtime); mtimes++; } /* free(mdlfiles[i]); */ } } void load_pfs_times() { int ncnt=0; int iret=0,i; char gemmodelstring[80]; XmStringTable str_list = NULL; sprintf(gemmodelstring,"%s/%s",g_pfs_pathname,g_pfs_mdlsoundfile); XtVaSetValues(mdlfile_text, XmNvalue, gemmodelstring, NULL); get_gem_times(gemmodelstring,time_list,&ntimes,&iret,strlen(gemmodelstring)); if (iret == 0) { str_list = (XmStringTable) XtMalloc (ntimes * sizeof (XmString)); for (i=0;id_name,".")==0) || (strcmp(entry->d_name,"..")==0)) return (FALSE); if ((strstr(entry->d_name,g_pattern))==NULL) return (FALSE); return(TRUE); } void AppendMdlFileToList ( Widget list, char* item) { XmString xmstring; xmstring = XmStringCreateSimple(item); XmListAddItemUnselected(list,xmstring,0); XmStringFree(xmstring); } void lf_cancel_cb (Widget w, XtPointer client_data, XtPointer call_data ) { XtUnmanageChild (lf_dialog); } /*NP*/ void get_mdlfile ( Widget w, XtPointer client_data, XtPointer call_data ) /*************************************************************/ /* GET_MDLFILE */ /*************************************************************/ { char gemdevice[72]; int iret,mapindx=0; char *file = NULL, filename[200]; XmFileSelectionBoxCallbackStruct *cbs = (XmFileSelectionBoxCallbackStruct *) call_data; XmStringTable str_list; int i; if (cbs) { if ( !XmStringGetLtoR (cbs->value, XmFONTLIST_DEFAULT_TAG, &file) ) return; XtVaSetValues ( mdlfile_text, XmNvalue, file, NULL ); strcpy ( mdlsoundfile, file ); XtFree(file); get_mdl_times ( mdlsoundfile, mtime_list, &mtimes, strlen(mdlsoundfile) ); mdlsoundtime[0] = '\0'; str_list = (XmStringTable) XtMalloc (mtimes * sizeof (XmString *) ); for ( i=0; i < mtimes; i++ ) { /* mtime_list[i][18] = 0; ???*/ str_list[i] = XmStringCreateLocalized (mtime_list[i]); } XtVaSetValues ( mdlfile_timelist, XmNitems, str_list, XmNitemCount, mtimes, NULL ); for ( i=0; i < mtimes; i++ ) XmStringFree ( str_list[i] ); XtFree ( (XtPointer)str_list ); } /* Added to Correct Lat/Lon trans Problem*/ /* strcpy(gemdevice,"maptop2"); map_init(&iret, gemdevice, strlen(gemdevice)); gclear(&iret); draw_map(mapindx, map_info, 1, &mapb, &iret); */ } /*NP*/ void set_mdlsta ( Widget w, XtPointer client_data, XtPointer call_data ) /*************************************************************/ /* SET_MDLSTA */ /*************************************************************/ { char *text_sta; g_mlocationSelected=-1; text_sta = XmTextGetString (w); if ( text_sta != NULL ) strcpy ( mdlsoundsta, text_sta ); XtFree(text_sta); } /*NP*/ void set_pvsounding ( Widget w, XtPointer client_data, XtPointer call_data ) /*************************************************************/ /* SET_MDLSTA */ /*************************************************************/ { char *text_sta; text_sta = XmTextGetString (w); if ( text_sta != NULL ) strcpy ( g_pvsound, text_sta ); XtFree(text_sta); } /*NP*/ void set_user_level ( Widget w, XtPointer client_data, XtPointer call_data ) /*************************************************************/ /* SET_USER_LEVEL */ /*************************************************************/ { char *text_sta; text_sta = XmTextGetString (w); if ( text_sta != NULL ) sscanf ( text_sta, "%f", &user_level ); else user_level = 850; XtFree(text_sta); } void parcelLevelactivateCB(Widget w, XtPointer client_data, XtPointer call_data) { current_parcel = 6; define_parcel( 6, user_level ); Toggle_Callback(rbutton[5],5,(XtPointer)NULL); XmToggleButtonSetState(rbutton[5],True,True); redraw_graph(1); show_parcel(); XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg), gc, 0, 0, xwdth, xhght, 0, 0 ); XFlush ( XtDisplay(draw_reg) ); } void pfsmtime_select_cb(Widget w, XtPointer client_data, XtPointer call_data) { int i,j,iret; XmStringTable str_list; char *dattim; char timestring[80]; char *timeoper[]= {"<<","<","||",">",">>"}; char *mdlouttext,*p; XtVaGetValues(pfsmdlfile_timelist, XmNselectedItemCount, &g_nmtimes, XmNselectedItems, &str_list, NULL ); if (g_nmtimes > 0) { for (i=0;i",">>"}; Widget lastWidget; char date[9],runhr[5],time[4]; char *str_type[20]; char parsestring[80]; XrmValue value; int count; parsestring[0]='\0'; if (XrmGetResource(g_applicationDB,"nsharp*lf_panel.parsestrng", "Sharp95*lf_panel.Parsestring",str_type,&value) == True) strncpy(parsestring,value.addr,(int) value.size); XtVaGetValues(mdlfile_timelist, XmNselectedItemCount, &g_nmtimes, XmNselectedItems, &str_list, NULL ); if (g_nmtimes > 0) { for (i=0;iitem, XmFONTLIST_DEFAULT_TAG, &choice ); strcpy ( mdlsoundtime, choice ); XtFree (choice);*/ g_allModelParamsSW=-1; g_raobModelSW=2; /* print mdl times */ root=DefaultRootWindow(XtDisplay(time_reg)); if (!g_pixcreated) { time_window=XCreatePixmap(XtDisplay(time_reg),root,600,g_twdth,8); time_oper_window=XCreatePixmap(XtDisplay(time_oper_reg),root,140,40,8); g_pixcreated=-1; } XSetForeground(XtDisplay(time_reg), gc2, pixels[0] ); XFillRectangle (XtDisplay(time_reg), time_window, gc2, 0, 0, 600, g_twdth ); XSetForeground(XtDisplay(time_oper_reg), gc3, pixels[0] ); XFillRectangle (XtDisplay(time_oper_reg), time_oper_window, gc3, 0, 0, 140, 40 ); XSetForeground(XtDisplay(time_reg), gc2, pixels[5] ); strcpy(timestring,"Forecast Times (hours):"); XDrawString( XtDisplay(time_reg), (time_window), gc2, 1, 10, timestring, strlen(timestring)); XSetForeground(XtDisplay(time_oper_reg), gc3, pixels[5] ); for (i=0;i<5;i++) { strcpy(timestring, timeoper[i]); XDrawString( XtDisplay(time_oper_reg), (time_oper_window), gc3, i*20, 24, timestring, strlen(timestring)); } for (i=0;i< mtimes;i++) { strncpy(timestring,mtimeac_list[i]+13,2); timestring[2]='\0'; XSetForeground(XtDisplay(time_reg), gc2, pixels[5] ); for (j=0;j< g_nmtimes;j++) { /*if (strcmp(mdlsoundtime,mtime_list[i])==0) */ if (strcmp(g_msoundtimes[j],mtimeac_list[i])==0) { XSetForeground(XtDisplay(time_reg), gc2, pixels[2] ); break; } } XDrawString( XtDisplay(time_reg),(time_window),gc2,i*(8*4), 24, timestring,strlen(timestring)); } XCopyArea(XtDisplay(time_reg),time_window, XtWindow(time_reg), gc2, 0, 0, 600,g_twdth,0,0); XCopyArea(XtDisplay(time_oper_reg),time_oper_window, XtWindow(time_oper_reg), gc3, 0, 0, 100, 40,0,0); } /*NP*/ void Load_mdl_sounding () /*************************************************************/ /* LOAD_MDL_SOUNDING */ /*************************************************************/ { Widget mapwin; Window gwin; GC gemgc; Display *display; int xwdth, xhght, xdpth; int newlev = 0; float ix1, ix2; float lng=-107.1; float lat=38.9; int i,j,k,i1; char timestring[80]; char buf[80]; Cursor cursor=(Cursor) None; display=XtDisplay(gemlbl_station2); gwin=XtWindow(gemlbl_station2); cursor=XCreateFontCursor(display,XC_watch); XDefineCursor(display,gwin,cursor); display=XtDisplay(mdl_dialog); gwin=XtWindow(mdl_dialog); cursor=XCreateFontCursor(display,XC_watch); XDefineCursor(display,gwin,cursor); display=XtDisplay(draw_reg); gwin=XtWindow(draw_reg); cursor=XCreateFontCursor(display,XC_watch); XDefineCursor(display,gwin,cursor); XFlush(XtDisplay(mdl_dialog)); if ( mdlsoundfile[0] != '\0' && mdlsoundtime[0] != '\0' && mdlsoundsta[0] != '\0' ) { if (numlvl > 0) copy_sndg(); sndg2[0][0]=numlvl; strcpy(g_mdlsoundstawrk,mdlsoundsta); for (i=0;i0) sprintf(mdlsoundsta,"%4.1fN %5.1fW",g_lat,-g_lng); else if (g_lng>0 && g_lat>0) sprintf(mdlsoundsta,"%4.1fN %5.1fE",g_lat,g_lng); else if (g_lng<0 && g_lat<0) sprintf(mdlsoundsta,"%4.1fS %5.1fW",-g_lat,-g_lng); else sprintf(mdlsoundsta,"%4.1fS %5.1fE",-g_lat,g_lng); } numlvl = (short) newlev; xtnd_sndg(); save_origsndg (); sprintf ( raobtitle, " %s %s %s ", mdl_selected, g_msoundtimes[i], mdlsoundsta ); sprintf( raob_type, "%s %5.0f ft","Model Forecast Elev=", g_elev * 3.28 ); /* mode = 1; */ if (i== 0) { XtUnmanageChild (mdl_dialog); } resize_callback ( draw_reg, (XtPointer)NULL, (XtPointer)NULL ); if ( numlvl > 0 && (! (mode==3 || mode==4)) ) { define_parcel( current_parcel, user_level ); mean_wind( -1, -1, &ix1, &ix2, &st_dir, &st_spd); show_parcel (); pagenum = 1; show_page( pagenum ); } strcpy(buf,"LOADING...PLEASE WAIT"); XDrawString(XtDisplay(time_oper_reg),XtWindow(time_oper_reg),gc3,1,24,buf,strlen(buf)); XFlush(XtDisplay(mdl_dialog)); XFlush(XtDisplay(time_oper_reg)); XFlush(XtDisplay(draw_reg)); } } g_act_sndg=0; XCopyArea(XtDisplay(time_oper_reg),time_oper_window, XtWindow(time_oper_reg), gc3, 0, 0, 140,40,0,0); LoadSingleModelSounding(g_act_sndg); NuiDefaultCursor(gemlbl_station2); NuiDefaultCursor(mdl_dialog); NuiDefaultCursor(draw_reg); } /*NP*/ void ellipse (int type, short x, short y, short width, short height ) /*************************************************************/ /* ELLIPSE */ /*************************************************************/ { if ( type == 0 ) { XDrawArc ( XtDisplay(draw_reg), canvas, gc, x, y, width - x, height - y, 0, 360*64 ); } else if ( type == 1 ) { XFillArc ( XtDisplay(draw_reg), canvas, gc, x, y, width - x, height - y, 0, 360*64 ); } } /*NP*/ void StartLoop( void ) /*************************************************************/ /* STARTLOOP */ /*************************************************************/ { set_font(2); XtAppMainLoop(app); } /*NP*/ void print_soundings () /*************************************************************/ /* PRINT_SOUNDINGS */ /*************************************************************/ { int newlev = 0, iret; float ix1, ix2; char gemdevice[72], gemyaxis[72], gemtimes[72], *cptr; if ( gemsoundfile[0] != '\0' && gemsoundtime[0] != '\0' && gemsoundsta[0] != '\0' ) { if ( item_type == 2 ) { mode = 3; XtUnmanageChild (gem_dialog); sprintf ( gemyaxis, "0/%s/1000/2;0;1", x_hght ); cptr = gemsoundsta; cptr++; strcpy ( gemtimes, gemsoundtime ); strcat ( gemtimes, "-last" ); strcpy ( gemdevice, "datatop" ); sncross (gemsoundfile, gemtimes, gemyaxis, cptr, strlen(gemsoundfile), strlen(gemtimes), strlen(gemyaxis), strlen(gemsoundsta)-1); } } } void set_gempak_file ( Widget w, XtPointer client_data, XtPointer call_data ) /*************************************************************/ /* LOAD_GEMFILE */ /*************************************************************/ { int type = (int) client_data; switch ( type ) { case 0: strcpy ( gemsoundfile, gemsoundraob ); break; case 1: strcpy ( gemsoundfile, gemsoundtamdar ); break; case 2: strcpy ( gemsoundfile, gemsoundprof ); break; case 3: strcpy ( gemsoundfile, gemsoundvad ); break; } XtVaSetValues ( gemfile_text, XmNvalue, gemsoundfile, NULL ); gemfile_times (); gemsoundtime[0] = '\0'; Load_stationlist ( 0 ); } void xsection_hght_cb ( Widget w, XtPointer client_data, XtPointer call_data) { int item_no = (int) client_data; strcpy ( x_hght, levellist[item_no] ); } void gemfile_times () /*************************************************************/ /* GET_GEMFILE */ /*************************************************************/ { XmStringTable str_list = NULL; int i, ncnt, iret; if ( gemsoundfile[0] != '\0' ) { get_gem_times ( gemsoundfile, time_list, &ntimes, &iret, strlen(gemsoundfile) ); gemsoundtime[0] = '\0'; if ( iret == 0 ) { str_list = (XmStringTable) XtMalloc (ntimes * sizeof (XmString) ); for ( i=ntimes-1; i >= 0 ; i-- ) { time_list[i][11] = 0; str_list[ntimes-1-i] = XmStringCreateLocalized (time_list[i]); } XtVaGetValues ( gemfile_timelist, XmNitemCount, &ncnt, NULL ); XtVaSetValues ( gemfile_timelist, XmNitemCount, ntimes, XmNitems, str_list, NULL ); for ( i=0; i < ntimes; i++ ) XmStringFree ( (XmString )str_list[i] ); XtFree ( (char *)str_list ); } } else { XmListDeselectAllItems (gemfile_timelist); XtVaSetValues ( gemfile_timelist, XmNitemCount, 0, XmNitems, str_list, NULL ); gemsoundfile[0] = '\0'; } } /*NP*/ void clean_uvvs(void) { short i; for(i=0;ixbutton.button == 1 && g_raobModelSW==2) { /* Determine which Forecast Hour */ /* Using Primitive assumption forecast hr subscript=int(xc/32.0) */ fhrsub=(int)(event->xbutton.x/32.0); if (g_mlocationSelected) { strcpy(mdlsoundtime,mtimeac_list[fhrsub]); strcpy(mdlsoundfile,mtime_list[fhrsub]); /* Identify if mdlsoundtime in g_msoundtimes[1..g_nmtimes] */ for (i=0;ixbutton.button == 1 && g_raobModelSW==1) { /* Determine which Forecast Hour */ /* Using Primitive assumption forecast hr subscript=int(xc/32.0) */ fhrsub=(int)(event->xbutton.x/40.0); if (fhrsubxbutton.button == 1 && g_pfs_model_sel_sw) { /* More complex computation derived from 3-rows of time*/ /* x/37.5 +16*(y/12) */ fhrsub = (int)((int) (event->xbutton.x/37.5)+16*(event->xbutton.y/12)); if (fhrsub",">>"}; /* LJH added to correct mysterious load advance problems */ XtRemoveEventHandler( time_oper_reg, ButtonReleaseMask, FALSE, (XtEventHandler) getTimeOper, (XtPointer)NULL); XtRemoveEventHandler( time_reg, ButtonReleaseMask, FALSE, (XtEventHandler)getModelForTime, (XtPointer)NULL); if (event->xbutton.button == 1 && (g_raobModelSW==2 || g_pfs_model_sel_sw)) { oprsub=(int)(event->xbutton.x/20.0); switch (oprsub) { case 0: if (! g_looponsw) { g_looponsw=-1; g_timer=XtAppAddTimeOut(XtWidgetToApplicationContext(w), 250, LoopBackward, w); } break; case 1: g_act_sndg--; if (g_act_sndg<0) g_act_sndg=g_nmtimes-1; LoadSingleModelSounding(g_act_sndg); break; case 2: if (g_looping) { g_looping=0; g_looponsw=0; XtRemoveTimeOut(g_timer); } if (numlvl>0 && (! (mode==3 || mode==4))) { show_parcel(); show_page(pagenum); } break; case 3: g_act_sndg++; if (g_act_sndg>g_nmtimes-1) g_act_sndg=0; LoadSingleModelSounding(g_act_sndg); break; case 4: if (! g_looponsw) { g_looponsw=-1; g_timer=XtAppAddTimeOut(XtWidgetToApplicationContext(w), 250, LoopForward, w); } break; } for (i=0;i<5;i++) { strcpy(timestring, timeoper[i]); if (i==oprsub) XSetForeground(XtDisplay(time_oper_reg), gc3, pixels[2] ); else XSetForeground(XtDisplay(time_oper_reg), gc3, pixels[5] ); XDrawString( XtDisplay(time_oper_reg), (time_oper_window), gc3, i*20, 24, timestring, strlen(timestring)); } XCopyArea(XtDisplay(time_oper_reg),time_oper_window, XtWindow(time_oper_reg), gc3, 0, 0, 140, 40,0,0); XtAddEventHandler(time_reg, ButtonReleaseMask, FALSE, (XtEventHandler) getModelForTime, (XtPointer)NULL); XtAddEventHandler(time_oper_reg, ButtonReleaseMask, FALSE, (XtEventHandler) getTimeOper, (XtPointer)NULL); } } /*NP*/ static void LoopForward (XtPointer w, XtIntervalId* timer) /**********************************************************************/ /* LOOPFORWARD */ /**********************************************************************/ { g_act_sndg++; if (g_act_sndg>g_nmtimes-1) g_act_sndg=0; LoadSingleModelSounding(g_act_sndg); if (g_act_sndg==g_nmtimes-1) timer = (XtIntervalId*) XtAppAddTimeOut(XtWidgetToApplicationContext(w),750,(XtTimerCallbackProc) LoopForward,w); else timer = (XtIntervalId*) XtAppAddTimeOut(XtWidgetToApplicationContext(w),250,(XtTimerCallbackProc) LoopForward,w); g_looping=-1; } static void LoopBackward (XtPointer w, XtIntervalId* timer) /**********************************************************************/ /* LOOPBACKWARD */ /**********************************************************************/ { g_act_sndg--; if (g_act_sndg<0) g_act_sndg=g_nmtimes-1; LoadSingleModelSounding(g_act_sndg); if (g_act_sndg == 0) timer = (XtIntervalId*) XtAppAddTimeOut(XtWidgetToApplicationContext(w), 750,(XtTimerCallbackProc) LoopBackward,w); else timer = (XtIntervalId*) XtAppAddTimeOut(XtWidgetToApplicationContext(w), 250,(XtTimerCallbackProc) LoopBackward,w); g_looping=-1; } /*NP*/ void LoadSingleModelSounding(int g_act_sndg) /**********************************************************************/ /* LOADSINGLEMODELSOUNDING */ /**********************************************************************/ { int newlev = 0; float ix1, ix2; float lng=-107.1; float lat=38.9; int i,j,k,i1; char timestring[80]; if ( (mdlsoundfile[0] != '\0' && mdlsoundtime[0] != '\0' && mdlsoundsta[0] != '\0') || g_pfs_model_sel_sw ) { /*copy sndgs[g_act_sndg] to sndg */ for (j=0;j0) sprintf(mdlsoundsta,"%4.1fN %5.1fW",g_lat,-g_lng); else if (g_lng>0 && g_lat>0) sprintf(mdlsoundsta,"%4.1fN %5.1fE",g_lat,g_lng); else if (g_lng<0 && g_lat<0) sprintf(mdlsoundsta,"%4.1fS %5.1fW",-g_lat,-g_lng); else sprintf(mdlsoundsta,"%4.1fS %5.1fE",-g_lat,g_lng); } numlvl = (short) g_newlev[g_act_sndg]; xtnd_sndg(); save_origsndg (); sprintf ( raobtitle, " %s %s %s ", mdl_selected, g_msoundtimes[g_act_sndg], mdlsoundsta ); if (g_pfs_model_sel_sw) sprintf( raob_type, "Model Point Forecast for %s Elev=%5.0f ft", sta_id, g_elev * 3.28); else sprintf( raob_type, "%s %5.0f ft", "Model Forecast Elev=", g_elev * 3.28); /* mode = 1; */ resize_callback ( draw_reg, (XtPointer)NULL, (XtPointer)NULL ); if ( (numlvl > 0 && (! (mode==3 || mode==4))) || g_pfs_model_sel_sw ) { define_parcel( current_parcel, user_level ); mean_wind( -1, -1, &ix1, &ix2, &st_dir, &st_spd); show_parcel (); pagenum = 1; show_page( pagenum ); } } } /*NP*/ void expose_time_reg_overlays (Widget w, XmDrawingAreaCallbackStruct *call_data) /***********************************************************************/ /* EXPOSE_TIME_REG_OVERLAYS */ /***********************************************************************/ { if (g_pixcreated) { XCopyArea(XtDisplay(time_reg), time_window, XtWindow(time_reg), gc2, 0, 0, 600, g_twdth, 0, 0); XFlush(XtDisplay(time_reg)); } } /*NP*/ void resize_time_reg_overlays (Widget w, XtPointer *data, XmDrawingAreaCallbackStruct *call_data) /***********************************************************************/ /* RESIZE_TIME_REG_OVERLAYS */ /***********************************************************************/ { if (g_pixcreated){ XCopyArea(XtDisplay(time_reg), time_window, XtWindow(time_reg), gc2, 0, 0, 600, g_twdth, 0, 0); XFlush(XtDisplay(time_reg)); } } /*NP*/ void expose_time_oper_reg_overlays (Widget w, XmDrawingAreaCallbackStruct *call_data) /***********************************************************************/ /* EXPOSE_TIME_OPER_REG_OVERLAYS */ /***********************************************************************/ { if (g_pixcreated) { XCopyArea(XtDisplay(time_oper_reg), time_oper_window, XtWindow(time_oper_reg), gc3, 0, 0, 100, 40, 0, 0); XFlush(XtDisplay(time_oper_reg)); } } /*NP*/ void resize_time_oper_reg_overlays (Widget w, XtPointer *data, XmDrawingAreaCallbackStruct *call_data) /***********************************************************************/ /* RESIZE_TIME_OPER_REG_OVERLAYS */ /***********************************************************************/ { if (g_pixcreated){ XCopyArea(XtDisplay(time_oper_reg), time_oper_window, XtWindow(time_oper_reg), gc3, 0, 0, 100, 40, 0, 0); XFlush(XtDisplay(time_oper_reg)); } } /*NP*/ void Make_Gif (Widget w, XtPointer *data, XmDrawingAreaCallbackStruct *call_data) { char buf[160]; char fname[160],ftype[5]; Widget giffsb; Arg args[8]; Cardinal n=0; XmString mask; XmString mask2; mask=XmStringCreateSimple("Enter A Gif Name...Suggested default: "); XtSetArg(args[n],XmNselectionLabelString,mask);n++; strcpy(ftype,".gif"); cvrttitletofilename(raobtitle,fname,ftype); if (strlen(fname)==0) mask2=XmStringCreateSimple("zztmp.gif"); else mask2=XmStringCreateSimple(fname); XtSetArg(args[n],XmNtextString,mask2);n++; giffsb=XmCreatePromptDialog(w,"giffsb",args,n); XtAddCallback(giffsb,XmNokCallback, (XtCallbackProc) GifFileOKCallback, (XtPointer) NULL); XtUnmanageChild(XmSelectionBoxGetChild(giffsb,XmDIALOG_HELP_BUTTON)); XtManageChild(giffsb); } void GifFileOKCallback(Widget fsb,XtPointer client_data,XtPointer call_data) { XmSelectionBoxCallbackStruct* ptr; char*string; char rec[100]; char buf[80]; ptr=(XmSelectionBoxCallbackStruct*) call_data; XmStringGetLtoR(ptr->value,XmSTRING_DEFAULT_CHARSET,&string); /* printf("Selected file named [%s]\n",string); printf ("In Make Gif \n"); printf ("Window id is %lX \n",XtWindow(draw_reg)); */ sprintf(buf,"xwd -id %lu|xwdtopnm|ppmtogif > %s \n",XtWindow(draw_reg),string); system(buf); XtFree(string); XtUnmanageChild(fsb); } void cvrttitletofilename(char *raobtitle,char *fname,char *ftype) { int i; int count=0; char raobwork[80]; char *p; fname[0]='\0'; strcpy(raobwork,raobtitle); p=strstr(raobwork,"@"); if (p!=NULL) { for (i=0;i<6;i++) p[i]=' '; } for (i=0;i='0' && raobwork[i]<='9') || (toupper(raobwork[i])>='A' && toupper(raobwork[i])<='Z') || raobwork[i]=='.') { if (raobwork[i]=='.') fname[count]='_'; else fname[count]=raobwork[i]; count++; } ; fname[count]='\0'; strcat(fname,ftype); } void idle(double duration) { static struct timeval TimeNow; static struct timezone TZ; double startTime_sec,startTime_usec,nowTime_sec,nowTime_usec,elapsedTime; gettimeofday(&TimeNow,&TZ); startTime_sec=TimeNow.tv_sec; startTime_usec=TimeNow.tv_usec; elapsedTime=0.0; while (elapsedTime