Mapper
display_data.old.c
Go to the documentation of this file.
1 #include "prototypes_new.h"
2 
3 extern struct stn_values *stn_values;
5 extern int max_width,max_height;
6 extern XFontStruct *info_font[10];
7 extern Font font[10];
8 extern int init_subdisplay;
9 extern Display *display;
10 extern Window bwindow[20],root_win;
11 extern struct save_rec2 save_rec[20];
12 extern char qual[10];
13 extern int display_method;
14 extern Widget bdrawing_area[10];
15 extern Widget draw_dialog[10];
16 extern Widget top_level;
17 extern Widget bmain_window;
18 extern unsigned long mmap[16];
19 extern GC gc1;
20 void options_draw();
21 void quit_draw();
24 extern struct stn_rec stn_rec;
25 
27 
28 void display_data(char *hb5,char *pc,int dmonth,int dday,int dyear,int dhour,
29  int ddays,char *fname)
30 
31 {
32 
33 int i;
34 time_t tim;
35 struct tm *gmtim;
36 Cardinal argcount;
37 Arg args[10];
38 struct stim btime;
39 struct stim etime;
40 
41 month=dmonth;
42 day=dday;
43 year=dyear;
44 hour=dhour;
45 days=ddays;
46 
47 if(init_subdisplay == 0) {
48 
49  stn_values=calloc(10000,sizeof(struct stn_values));
50 
51  for(i=0;i<10;i++) {
52 
53  draw_dialog[i]=0;
54  save_rec[i].inum=-1;
55  save_rec[i].volume=0;
56 
57 
58  }
59 
60  gc1= XCreateGC(display,root_win,0,0);
61 
62  init_subdisplay=1;
63 
64 }
65 
66 btime.year=year;
67 btime.month=month;
68 btime.day=day;
69 btime.hour=hour;
70 
72 
73 tim=tim-days*86400L;
74 gmtim=gmtime(&tim);
75 
76 etime.year=gmtim->tm_year+1900;
77 etime.month=gmtim->tm_mon+1;
78 etime.day=gmtim->tm_mday;
79 etime.hour=gmtim->tm_hour;
80 
81 get_new_values(etime,btime,hb5,pc,fname);
82 
83 }
84 
85 void get_new_values(struct stim etim,struct stim btim,char *hb5,
86  char *pc,char *fname)
87 
88 {
89 
90 struct MenuItem items[10];
91 int j,inum,i,ier,ierr,qflow,len,k;
92 char *text,buf[300],sbuf[150],hbuf[10];
93 char *spaces;
94 Cardinal argcount;
95 Dimension width,height;
96 Arg args[10];
97 Widget menu_bar,main_bar,jwidget;
98 XmString cancel,file_string,print_string;
100 double qstage;
101 char *p;
102 int num,intbuf[10];
103 int ok_num;
104 char quality;
105 Display *disp;
106 char fbuf[100];
107 FILE *fp;
108 
109 spaces=" ";
110 
111 file_string=XmStringCreateLocalized("file");
112 print_string=XmStringCreateLocalized("print");
113 cancel=XmStringCreateLocalized("quit");
114 
116 
117 for(j=0;j<10;j++){
118 
119  if(draw_dialog[j]==0)
120  break;
121 
122  }
123 
124  if(j==10) {
125 
126  berror(top_level,"No creation space");
127  return;
128 
129  }
130 
131 if(display_method==1) {
132 
133  disp=XtDisplay(top_level);
134 
135  argcount=0;
136  XtSetArg(args[argcount],XmNdeleteResponse,XmDO_NOTHING);argcount++;
137  draw_dialog[j]=XmCreateMessageDialog(top_level,"Time series",
138  args,argcount);
139 
140 
141  XtUnmanageChild(XmMessageBoxGetChild(draw_dialog[j],
142  XmDIALOG_OK_BUTTON));
143  XtUnmanageChild(XmMessageBoxGetChild(draw_dialog[j],
144  XmDIALOG_HELP_BUTTON));
145  XtUnmanageChild(XmMessageBoxGetChild(draw_dialog[j],
146  XmDIALOG_CANCEL_BUTTON));
147  XtUnmanageChild(XmMessageBoxGetChild(draw_dialog[j],
148  XmDIALOG_SEPARATOR));
149 
150  argcount=0;
151  XtSetArg(args[argcount],XmNwidth,bmax_width);argcount++;
152  XtSetArg(args[argcount],XmNheight,bmax_height);argcount++;
153  XtSetArg(args[argcount],XmNbackground,0);argcount++;
154  bmain_window=XmCreateMainWindow(draw_dialog[j],"Main",
155  args,argcount);
156 
157  XtManageChild(bmain_window);
158 
159  argcount=0;
160  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
161  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
162  menu_bar=XmCreateMenuBar(bmain_window,"Menubar",args,argcount);
163  XtManageChild(menu_bar);
164 
165  argcount=0;
166  XtSetArg(args[argcount],XmNwidth, bmax_width);argcount++;
167  XtSetArg(args[argcount],XmNheight,bmax_height);argcount++;
168  XtSetArg(args[argcount],XmNresizePolicy,XmRESIZE_ANY);argcount++;
169  XtSetArg(args[argcount],XmNbackground,0);argcount++;
170  bdrawing_area[j]=XmCreateDrawingArea(bmain_window,"bdrawing_area",
171  args,argcount);
172 
173  XtManageChild(bdrawing_area[j]);
174 
175  XmMainWindowSetAreas(bmain_window,menu_bar,NULL,NULL,NULL,
176  bdrawing_area[j]);
177 
178  items[0].label="Quit";
179  items[0].callback=quit_draw;
180  items[0].callback_data=(XtPointer)j;
181  items[1].label=NULL;
182 
183  main_bar=BuildPulldownPushMenu(menu_bar,"File",'M',items);
184  jwidget=AttachToCascade(menu_bar,"File",main_bar);
185 
186  items[0].label="Linear stage";
187  items[0].callback=options_draw;
188  items[0].callback_data=(XtPointer)(0+j*100);
189  items[1].label="Linear flow";
190  items[1].callback=options_draw;
191  items[1].callback_data=(XtPointer)(1+j*100);
192  items[2].label="Scale to data";
193  items[2].callback=options_draw;
194  items[2].callback_data=(XtPointer)(2+j*100);
195  items[3].label="Scale to flood";
196  items[3].callback=options_draw;
197  items[3].callback_data=(XtPointer)(3+j*100);
198  items[4].label=NULL;
199 
200  main_bar=BuildPulldownPushMenu(menu_bar,"Options",'M',items);
201  jwidget=AttachToCascade(menu_bar,"Options",main_bar);
202 
203  XtManageChild(draw_dialog[j]);
204 
205  bwindow[j]=XtWindow(bdrawing_area[j]);
206 
207  XmUpdateDisplay(bdrawing_area[j]);
208 
209  sprintf(fbuf,"%s/scratch.%d",fname,j);
210 
211  sprintf(sbuf,"get_data %s %s %d %d %d %d %d %s",
212  hb5,pc,month,day,year,hour,days,fbuf);
213 
214  system(sbuf);
215 
216 
217  fp=fopen(fbuf,"r");
218  inum=0;
219  ier=-1;
220 
221  if(fp!=NULL) {
222 
223  fread(&stn_rec,sizeof(struct stn_rec),1,fp);
224 
225  fread(&inum,sizeof(int),1,fp);
226 
227  for(k=0;k<inum;k++)
228  fread(&stn_values[k],sizeof(struct stn_values),1,fp);
229 
230  fread(&ier,sizeof(int),1,fp);
231  if(ier==1)
232  fread(&rate_table,sizeof(RatingTable),1,fp);
233 
234 
235  fclose(fp);
236 
237  }
238 
239 
240  /* need stn_rec array */
241  /* stn_values structure */
242  /* inum */
243  /* inum stn values*/
244  /* rate_table array*/
245 
246  if(ier!=1)
247  rate_table.AryMax=-1;
248 
249 /* if(ier==1 && toupper(pc[0])=='Q')
250  to_stage(hb5,'H','G',stn_values,inum);
251 */
252 
253  save_rec[j].is_realized=-1;
254 
255  memcpy(&save_rec[j].stn_rec,&stn_rec,sizeof(struct stn_rec));
256  memcpy(&save_rec[j].parm,pc,10);
257  memcpy(&save_rec[j].btim,&btim,sizeof(struct stim));
258  memcpy(&save_rec[j].etim,&etim,sizeof(struct stim));
259  memcpy(&save_rec[j].stn_values,stn_values,
260  inum*sizeof(struct stn_values));
261 
262  memcpy(&save_rec[j].rate_table,&rate_table,sizeof(RatingTable));
263 
264  save_rec[j].inum=inum;
265 
266  save_rec[j].volume=0;
267 
268  if(save_rec[j].parm[2]=='M')
269  save_rec[j].volume=24*30;
270 
271  if(save_rec[j].parm[2]=='D')
272  save_rec[j].volume=24;
273 
274  else if(save_rec[j].parm[2]=='Q')
275  save_rec[j].volume=6;
276 
277  else if(save_rec[j].parm[2]=='H')
278  save_rec[j].volume=1;
279 
280  save_rec[j].qnum=0;
281 
282  if(pc[4]=='M') {
283 
284  sprintf(sbuf,"get_data %s %s %d %d %d %d %d %s",
285  hb5,"SWIRMZZ",month,day,year,hour,days,fbuf);
286 
287  system(sbuf);
288 
289  fp=fopen(fbuf,"r");
290  inum=0;
291  ier=-1;
292 
293  if(fp!=NULL) {
294 
295  fread(&stn_rec,sizeof(struct stn_rec),1,fp);
296 
297  fread(&inum,sizeof(int),1,fp);
298 
299  for(k=0;k<inum;k++)
300  fread(&stn_values[k],sizeof(struct
301  stn_values),1,fp);
302 
303  fread(&ier,sizeof(int),1,fp);
304  if(ier==1)
305  fread(&rate_table,sizeof(RatingTable),1,fp);
306 
307 
308  fclose(fp);
309 
310  }
311 
312  memcpy(&save_rec[j].qtn_rec,&stn_rec,sizeof(struct stn_rec));
313  memcpy(&save_rec[j].qarm,"SWIRMZZ\0\0\0",10);
314  memcpy(&save_rec[j].btim,&btim,sizeof(struct stim));
315  memcpy(&save_rec[j].etim,&etim,sizeof(struct stim));
316  memcpy(&save_rec[j].qtn_values,stn_values,
317  inum*sizeof(struct stn_values));
318 
319  memcpy(&save_rec[j].qate_table,&rate_table,sizeof(RatingTable));
320 
321  save_rec[j].qnum=inum;
322 
323  save_rec[j].qolume=0;
324 
325  if(save_rec[j].parm[2]=='M')
326  save_rec[j].qolume=24*30;
327 
328  if(save_rec[j].parm[2]=='D')
329  save_rec[j].qolume=24;
330 
331  else if(save_rec[j].parm[2]=='Q')
332  save_rec[j].qolume=6;
333 
334  else if(save_rec[j].parm[2]=='H')
335  save_rec[j].qolume=1;
336 
337  }
338 
339  XSetFunction(display,gc1,GXcopy);
340  XSetForeground(display,gc1,mmap[0]);
341  XSetBackground(display,gc1,mmap[0]);
342  XFillRectangle(display,bwindow[j],gc1,0,0,
344 
345  XtSetArg(args[0],XtNwidth,&width);
346  XtSetArg(args[1],XtNheight,&height);
347  XtGetValues(bdrawing_area[j],args,2);
348 
349 
350  draw_area(j,j,0,0,width,height);
351 
352 
353  XmStringFree(file_string);
354  XmStringFree(print_string);
355  XmStringFree(cancel);
356 
357  XtAddCallback(bdrawing_area[j],XmNexposeCallback,bhandle_expose,
358  (XtPointer)j);
359 
360  XtAddCallback(bdrawing_area[j],XmNresizeCallback,bhandle_expose,
361  (XtPointer)j);
362 
363  return;
364 
365  }
366 
367 }
368 
369 
370 void draw_area(int k,int m,int xs,int ys,int xz,int yz)
371 
372 {
373 
374 int xparm1,yparm1,xparm2,yparm2;
375 int width,height;
376 struct tm tm;
377 time_t lbtim,letim,stim,otim;
378 char abuf[100],tbuf[100];
379 int xmax,ymax,xmin,ymin,maxtimes,maxvalues,yheight;
380 struct max_min max_min;
381 struct max_min max_min2;
382 
383 int deltat,i,text_width,j,h,qflag,ier;
384 float deltav,fminv;
385 float fxvalue,fyvalue,svalue,dxvalue;
386 int maxv,minv,smaxv,sminv,dvalue;
387 int xvalue,oday,yvalue,xvalue1,yvalue1,totlin,totdays,hour,ierr,flow,ilinear;
388 struct tm *gm;
389 char buf[200],ubuf[50],xbuf[50];
390 int inum,merr,ybegin,len;
391 XRectangle rect[1];
392 double stage,wrn,fld,abs1,abs2;
393 struct stn_values values[10000];
394 struct stn_values qalues[10000];
395 int qnum;
396 int aflag;
397 int htflag;
398 int line_width,line_style,cap_style,join_style,lines;
399 int totyears;
400 char oqual;
401 char pe2;
402 int oxvalue;
403 
404 ilinear=linear;
405 
406 pe2='G';
407 
408 if(save_rec[k].parm[1]=='P')
409  pe2='P';
410 
411 inum=save_rec[k].inum;
412 
413 memcpy(&values,&save_rec[k].stn_values,
414  inum*sizeof(struct stn_values));
415 
416 qnum=save_rec[k].qnum;
417 
418 memcpy(&qalues,&save_rec[k].qtn_values,
419  qnum*sizeof(struct stn_values));
420 
421 XSetFont(display,gc1,font[1]);
422 yheight=info_font[1]->ascent;
423 
424 rect[0].x=xs;
425 rect[0].y=ys;
426 rect[0].width=xz;
427 rect[0].height=yz;
428 
429 XSetFunction(display,gc1,GXcopy);
430 XSetForeground(display,gc1,mmap[0]);
431 XSetBackground(display,gc1,mmap[0]);
432 XSetClipRectangles(display,gc1,0,0,rect,1,Unsorted);
433 
434 width=xs+xz;
435 height=ys+yz;
436 
437 xparm1=75;
438 
439 if(qnum==0) {
440 
441  yparm1=yheight*5;
442  yparm2=yheight*3;
443  aflag=0;
444 
445 }
446 
447 else {
448 
449  yparm1=yheight*10;
450  yparm2=yheight*6;
451  aflag=4;
452 
453 }
454 
455 xparm2=75;
456 
457 /* set box size */
458 
459 XSetForeground(display,gc1,mmap[3]);
460 
461 XDrawLine(display,bwindow[m],gc1,xs+xparm1,height-yparm2,width-xparm1,
462  height-yparm2);
463 
464 XDrawLine(display,bwindow[m],gc1,xs+xparm1,ys+yparm1,width-xparm1,
465  ys+yparm1);
466 
467 XDrawLine(display,bwindow[m],gc1,xs+xparm1,ys+yparm1,xs+xparm1,
468  height-yparm2);
469 XDrawLine(display,bwindow[m],gc1,width-xparm1,ys+yparm1,width-xparm1,
470  height-yparm2);
471 
472 xmin=xs+xparm1+10;
473 xmax=width-xparm1-10;
474 ymin=ys+yparm1+10;
475 ymax=height-yparm2-10;
476 
477 XSetForeground(display,gc1,mmap[7]);
478 
479 if(inum==-1) {
480 
481  sprintf(buf,"%s %s not found in database",
483 
484  XDrawString(display,bwindow[m],gc1,(xmax+xmin-200)/2,
485  (ymax+ymin)/2,buf,strlen(buf));
486 
487  return;
488 
489  }
490 
491 /* draw hb5,name,etc text */
492 
493 XSetForeground(display,gc1,mmap[7]);
494 
496 
497 XDrawString(display,bwindow[m],gc1,xs+xparm1,ys+yparm1-yheight*(4+aflag),
498  buf,strlen(buf));
499 
500 strcpy(tbuf,save_rec[k].parm);
501 
502 get_acronym(tbuf,abuf);
503 sprintf(buf,"%s %s %s",save_rec[k].stn_rec.id,tbuf,abuf);
504 
505 XDrawString(display,bwindow[m],gc1,xs+xparm1,ys+yparm1-yheight*(3+aflag),
506  buf,strlen(buf));
507 
508 if(inum==0) {
509 
510  strcpy(buf,"NO DATA");
511 
512  XDrawString(display,bwindow[m],gc1,(xmax+xmin)/2,(ymax+ymin)/2,
513  buf,strlen(buf));
514 
515  save_rec[k].is_realized=1;
516  return;
517 
518  }
519 
520 
521 if(qnum != 0) {
522 
523 XSetForeground(display,gc1,mmap[5]);
524 
526 
527 XDrawString(display,bwindow[m],gc1,xs+xparm1,ys+yparm1-yheight*4,
528  buf,strlen(buf));
529 
530 strcpy(tbuf,save_rec[k].qarm);
531 
532 get_acronym(tbuf,abuf);
533 sprintf(buf,"%s %s %s",save_rec[k].qtn_rec.id,tbuf,abuf);
534 
535 XDrawString(display,bwindow[m],gc1,xs+xparm1,ys+yparm1-yheight*3,
536  buf,strlen(buf));
537 
538  }
539 tm.tm_sec=0;
540 tm.tm_min=0;
541 tm.tm_hour=save_rec[k].btim.hour;
542 tm.tm_mday=save_rec[k].btim.day;
543 tm.tm_mon=save_rec[k].btim.month;
544 tm.tm_year=save_rec[k].btim.year;
545 
546 lbtim=ouptime(tm.tm_year,tm.tm_mon,tm.tm_mday,tm.tm_hour,tm.tm_min,0);
547 
548 tm.tm_sec=0;
549 tm.tm_min=0;
550 tm.tm_hour=save_rec[k].etim.hour;
551 tm.tm_mday=save_rec[k].etim.day;
552 tm.tm_mon=save_rec[k].etim.month;
553 tm.tm_year=save_rec[k].etim.year;
554 
555 letim=ouptime(tm.tm_year,tm.tm_mon,tm.tm_mday,tm.tm_hour,tm.tm_min,0);
556 
557 /* set up time coordinates */
558 
559 if(save_rec[k].parm[2]=='M') {
560 
561  totlin=(lbtim-letim)/(24L*3600L)+1;
562  deltat=24;
563  totyears=(lbtim-letim)/(24L*3600L*365L)+1;
564  hour=0;
565 
566  }
567 
568 else {
569 
570  hour=0;
571 /*
572  if(tm.tm_hour > 0 && tm.tm_hour <=6)
573  hour=6-tm.tm_hour;
574 
575  else if(tm.tm_hour > 6 && tm.tm_hour <=12)
576  hour=12-tm.tm_hour;
577 
578  else if(tm.tm_hour > 12 && tm.tm_hour <=18)
579  hour=18-tm.tm_hour;
580 
581  else if(tm.tm_hour > 18)
582  hour=24-tm.tm_hour;
583 */
584 
585  hour=24-tm.tm_hour;
586 
587  deltat=get_delta_time(lbtim,letim);
588 
589  htflag=0;
590 
591  if(deltat>=24)
592  htflag=1;
593 
594  maxtimes=(lbtim-letim)/(deltat*3600L);
595 
596  totdays=(lbtim-letim)/(24L*3600L)+1;
597 
598  totlin=totdays*24/deltat+4;
599 
600 
601  }
602 
603 oday=-1;
604 
605 XSetForeground(display,gc1,mmap[2]);
606 
607 for(i=0;i<=totlin;i++) {
608 
609  stim=letim+((i-4)*deltat*3600L) + hour*3600L;
610 
611  fxvalue=xmin+(float)(xmax-xmin)/(float)(letim-lbtim)*
612  (float)(letim-stim);
613 
614  xvalue=fxvalue;
615 
616  if(xvalue > width-xparm1)
617  break;
618 
619  if(xvalue < xs+xparm1)
620  continue;
621 
622  gm=gmtime(&stim);
623 
624  if(save_rec[k].parm[2]=='M'){
625 
626  if(gm->tm_mday==1 && gm->tm_mon==0) {
627 
628  XDrawLine(display,bwindow[m],gc1,xvalue,ys+yparm1,
629  xvalue,height-yparm2);
630 
631  if(totyears < 5)
632  sprintf(buf,"%d/%d",gm->tm_mon+1,gm->tm_year);
633 
634  else
635  sprintf(buf,"%d",gm->tm_year);
636 
637  text_width=XTextWidth(info_font[1],buf,strlen(buf));
638  XDrawString(display,bwindow[m],gc1,xvalue-text_width/2,
639  height-yparm2+yheight*2,buf,strlen(buf));
640 
641 
642  }
643 
644  else if(gm->tm_mday==1 && totyears < 2) {
645 
646  sprintf(buf,"%d",gm->tm_mon+1);
647  text_width=XTextWidth(info_font[1],buf,strlen(buf));
648  XDrawString(display,bwindow[m],gc1,xvalue-text_width/2,
649  height-yparm2+yheight*2,buf,strlen(buf));
650 
651 
652  }
653 
654 
655  continue;
656 
657 
658  }
659 
660  XDrawLine(display,bwindow[m],gc1,xvalue,ys+yparm1,
661  xvalue,height-yparm2);
662 
663  if(oday != gm->tm_mday) {
664 
665  if(gm->tm_hour==0 || htflag==1) {
666 
667  sprintf(buf,"%d/%d",gm->tm_mon+1,gm->tm_mday);
668  text_width=XTextWidth(info_font[1],buf,strlen(buf));
669  XDrawString(display,bwindow[m],gc1,xvalue-text_width/2,
670  height-yparm2+yheight*2,buf,strlen(buf));
671 
672  oday=gm->tm_mday;
673 
674  }
675 
676  }
677 
678  h=gm->tm_hour;
679 
680  qflag=0;
681 
682  if(deltat==1) {
683 
684  if(h==0 || h==2 || h==4 || h==6 || h==8 ||
685  h==10 || h==12 || h==14 || h==16 ||
686  h==18 || h==20 || h==22)
687  qflag=1;
688 
689  }
690 
691  else if(deltat==3 && totdays <= 2) {
692 
693 
694  if(h==0 || h==3 || h==6 || h==9 || h==12 ||
695  h==15 || h==18 || h==21)
696  qflag=1;
697 
698  }
699 
700  else if(deltat==3) {
701 
702  if(h==0 || h==6 || h==12 || h==18)
703  qflag=1;
704 
705  }
706 
707  else if(deltat==6) {
708 
709  if(h==0 || h==12)
710  qflag=1;
711 
712  }
713 
714  else if(deltat==24) {
715 
716  if(h==12)
717  qflag=1;
718 
719  }
720 
721  if(qflag==0)
722  continue;
723 
724  sprintf(buf,"%d",gm->tm_hour);
725  text_width=XTextWidth(info_font[1],buf,strlen(buf));
726  XDrawString(display,bwindow[m],gc1,xvalue-text_width/2,
727  height-yparm2+yheight,buf,strlen(buf));
728 
729  }
730 
731 /* get maxmin values */
732 
734 
735 max_min2=get_max_min(qalues,qnum);
736 
737 if(max_min2.max > max_min.max && qnum > 0) {
738 
739  maxv=max_min2.max + 1;
740 
741  if(maxv-max_min2.max < .4)
742  maxv++;
743 
744  }
745 
746 
747 
748 else {
749 
750  maxv=max_min.max + 1;
751 
752  if(maxv-max_min.max < .4)
753  maxv++;
754 
755  }
756 
757 if(max_min2.min < max_min.min && qnum > 0) {
758 
759  minv=max_min2.min - 1;
760 
761  if(minv-max_min2.min > .4)
762  minv--;
763 
764  }
765 
766 else {
767 
768  minv=max_min.min - 1;
769 
770  if(minv-max_min.min > .4)
771  minv--;
772 
773  }
774 
775 
776 if(save_rec[k].volume!=0)
777  minv=0;
778 
779 if(scale==1 && save_rec[k].rate_table.AryMax >= 0) {
780 
781  fminv=GetStage(save_rec[k].stn_rec.id,'H',
782  pe2,values[0].zdate,0,
783  &ierr);
784 
785  if(ierr >= 0 && ierr <= 2)
786  minv=fminv;
787 
788 
789  else
790  minv=save_rec[k].rate_table.RatStg[0];
791 
792 
793  }
794 
795 if(scale==1 && save_rec[k].rate_table.AryMax >= 0) {
796 
797  if(save_rec[k].rate_table.fld > 0 &&
799  maxv= save_rec[k].rate_table.fld + 2;
800 
801  else if(save_rec[k].rate_table.wrn > 0 &&
803  maxv= save_rec[k].rate_table.wrn + 2;
804 
805  }
806 
807 if(ilinear==1 && save_rec[k].rate_table.AryMax >= 0) {
808 
809  sminv=minv;
810  smaxv=maxv;
811 
812  if(minv < 0)
813  minv=0;
814 
815  minv=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
816  values[0].zdate,(double)minv,
817  &ierr);
818 
819  maxv=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
820  values[0].zdate,(double)maxv,
821  &merr);
822 
823  if(ierr == 3 || merr == 3) {
824 
825  ilinear=0;
826  minv=sminv;
827  maxv=smaxv;
828 
829  }
830 
831  }
832 
833 
834 deltav=get_delta_valu(maxv-minv);
835 maxvalues=(maxv-minv)/(deltav);
836 
837 lines=0;
838 
839 for(i=0;i<=maxvalues+2;i++) {
840 
841  svalue=(float)minv+(i*deltav);
842  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
843  (float)(svalue-minv);
844 
845  yvalue=fyvalue;
846  if(yvalue < ys+yparm1 || yvalue > height-yparm2)
847  continue;
848 
849  XSetForeground(display,gc1,mmap[2]);
850 
851  if(lines==0 && save_rec[k].volume != 0)
852  XSetForeground(display,gc1,mmap[9]);
853 
854  else
855  XSetForeground(display,gc1,mmap[2]);
856  lines++;
857 
858  XDrawLine(display,bwindow[m],gc1,xs+xparm1,yvalue,
859  width-xparm1,yvalue);
860 
861  if(ilinear==0 || (ilinear==1 &&
862  save_rec[k].rate_table.AryMax < 0)) {
863 
864  XSetForeground(display,gc1,mmap[2]);
865  sprintf(buf,"%6.1f",svalue);
866 
867  xvalue=width-xparm1+2;
868 
869  }
870 
871  else {
872 
873  flow=(int)svalue;
874 
875  sprintf(buf,"%d",flow);
876 
877  text_width=XTextWidth(info_font[1],buf,strlen(buf));
878 
879  xvalue=xs+xparm1-text_width;
880 
881  XSetForeground(display,gc1,mmap[2]);
882 
883  }
884 
885  for(j=0;j<6;j++)
886  if(buf[j] != ' ')
887  break;
888 
889  XDrawString(display,bwindow[m],gc1,xvalue,
890  yvalue+yheight/2,&buf[j],strlen(&buf[j]));
891 
892  if(save_rec[k].rate_table.AryMax < 0)
893  continue;
894 
895  if(ilinear==0 || (ilinear==1 &&
896  save_rec[k].rate_table.AryMax < 0)) {
897 
898  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
899  values[0].zdate,(double)svalue,
900  &ierr);
901 
902  }
903 
904  else {
905 
906  stage=GetStage(save_rec[k].stn_rec.id,'H',
907  pe2,values[0].zdate,
908  (int)svalue,&ierr);
909 
910  svalue=stage;
911 
912 
913  }
914 
915  if(ilinear==1 && save_rec[k].rate_table.AryMax >= 0) {
916 
917  XSetForeground(display,gc1,mmap[2]);
918  sprintf(buf,"%6.1f",svalue);
919  xvalue=width-xparm1+2;
920 
921  }
922 
923  else {
924 
925  sprintf(buf,"%d",flow);
926  text_width=XTextWidth(info_font[1],buf,strlen(buf));
927  xvalue=xs+xparm1-text_width;
928 
929  XSetForeground(display,gc1,mmap[2]);
930 
931  }
932 
933  for(j=0;j<6;j++)
934  if(buf[j] != ' ')
935  break;
936 
937  XDrawString(display,bwindow[m],gc1,xvalue,
938  yvalue+yheight/2,&buf[j],strlen(&buf[j]));
939 
940 }
941 
942 line_width=1;
943 line_style=LineOnOffDash;
944 cap_style=CapRound;
945 join_style=JoinRound;
946 
947 XSetLineAttributes(display,gc1,line_width,line_style,
948  cap_style,join_style);
949 
950 if(save_rec[k].rate_table.AryMax >= 0){
951 
952  if(ilinear==0)
953  fld=save_rec[k].rate_table.HMax;
954 
955  else {
956 
957  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
958  values[0].zdate,
959  (double)save_rec[k].rate_table.HMax,
960  &ierr);
961 
962  fld=(double)flow;
963 
964  }
965 
966  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
967  (float)(fld-minv);
968 
969  yvalue=fyvalue;
970 
971  XSetForeground(display,gc1,mmap[8]);
972 
973  if(yvalue > ys+yparm1 &&
974  yvalue < height-yparm2)
975  XDrawLine(display,bwindow[m],gc1,xs+xparm1,yvalue,
976  width-xparm1,yvalue);
977 
978 
979  }
980 
981 if(save_rec[k].rate_table.AryMax >= 0 &&
982  save_rec[k].rate_table.wrn > 0 ) {
983 
984  if(ilinear==0)
985  wrn=save_rec[k].rate_table.wrn;
986 
987  else {
988 
989  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
990  values[0].zdate,
991  (double)save_rec[k].rate_table.wrn,
992  &ierr);
993 
994  wrn=(double)flow;
995 
996  }
997 
998  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
999  (float)(wrn-minv);
1000 
1001  yvalue=fyvalue;
1002 
1003  XSetForeground(display,gc1,mmap[5]);
1004 
1005 
1006  line_width=1;
1007  line_style=LineOnOffDash;
1008  cap_style=CapRound;
1009  join_style=JoinRound;
1010 
1011  XSetLineAttributes(display,gc1,line_width,line_style,
1012  cap_style,join_style);
1013 
1014  if(yvalue > ys+yparm1 &&
1015  yvalue < height-yparm2)
1016  XDrawLine(display,bwindow[m],gc1,xs+xparm1,yvalue,
1017  width-xparm1,yvalue);
1018 
1019 
1020  }
1021 
1022 if(save_rec[k].rate_table.AryMax >= 0 &&
1023  save_rec[k].rate_table.fld > 0 ) {
1024 
1025  if(ilinear==0)
1026  fld=save_rec[k].rate_table.fld;
1027 
1028  else {
1029 
1030  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
1031  values[0].zdate,
1032  (double)save_rec[k].rate_table.fld,
1033  &ierr);
1034 
1035  fld=(double)flow;
1036 
1037  }
1038 
1039  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
1040  (float)(fld-minv);
1041 
1042  yvalue=fyvalue;
1043 
1044  XSetForeground(display,gc1,mmap[4]);
1045 
1046  if(yvalue > ys+yparm1 &&
1047  yvalue < height-yparm2)
1048  XDrawLine(display,bwindow[m],gc1,xs+xparm1,yvalue,
1049  width-xparm1,yvalue);
1050 
1051 
1052  }
1053 
1054 line_width=1;
1055 line_style=LineSolid;
1056 cap_style=CapRound;
1057 join_style=JoinRound;
1058 
1059 XSetLineAttributes(display,gc1,line_width,line_style,
1060  cap_style,join_style);
1061 
1062 XSetForeground(display,gc1,mmap[3]);
1063 
1064 if(save_rec[k].rate_table.AryMax >= 0) {
1065 
1066  xvalue=xs+10;
1067 
1068 
1069  get_units("Q",ubuf);
1070 
1071  len=strlen(ubuf);
1072 
1073  ybegin=ymin+((ymax-ymin) - len*yheight)/2;
1074 
1075  if(ybegin < ymin)
1076  ybegin=ymin;
1077 
1078  for(i=0;i<len;i++) {
1079 
1080  xbuf[0]=ubuf[i];
1081  xbuf[1]=0;
1082 
1083  yvalue=ybegin+i*yheight;
1084  XDrawString(display,bwindow[m],gc1,xvalue,
1085  yvalue,xbuf,strlen(xbuf));
1086 
1087 
1088  }
1089 
1090 }
1091 
1092 
1093 xvalue=width-20;
1094 
1095 if(save_rec[k].rate_table.AryMax > 0 &&
1096  (save_rec[k].parm[0]=='Q' && save_rec[k].parm[2]=='I') ||
1097  (save_rec[k].parm[0]=='L' && save_rec[k].parm[2]=='I') )
1098  get_units("H",ubuf);
1099 
1100 else
1101  get_units(save_rec[k].parm,ubuf);
1102 
1103 len=strlen(ubuf);
1104 
1105 ybegin=ymin+((ymax-ymin) - len*yheight)/2;
1106 
1107 if(ybegin < ymin)
1108  ybegin=ymin;
1109 
1110 for(i=0;i<len;i++) {
1111 
1112  xbuf[0]=ubuf[i];
1113  xbuf[1]=0;
1114 
1115  yvalue=ybegin+i*yheight;
1116  XDrawString(display,bwindow[m],gc1,xvalue,
1117  yvalue,xbuf,strlen(xbuf));
1118 
1119 
1120  }
1121 
1122 XSetForeground(display,gc1,mmap[7]);
1123 oxvalue=-1;
1124 
1125 if(save_rec[k].volume!= 0) {
1126 
1127  for(i=0;i<inum;i++) {
1128 
1129  tm.tm_year=values[i].zdate/10000-1900;
1130  tm.tm_mon=(values[i].zdate-(tm.tm_year+1900)*10000)/100;
1131  tm.tm_mday=values[i].zdate-(tm.tm_year+1900)*10000-tm.tm_mon*100;
1132  tm.tm_hour=values[i].ztime/10000;
1133  tm.tm_min=(values[i].ztime-tm.tm_hour*10000)/100;
1134 
1135  tm.tm_mon=tm.tm_mon;
1136  stim=ouptime(tm.tm_year+1900,tm.tm_mon,tm.tm_mday,
1137  tm.tm_hour,tm.tm_min,0);
1138 
1139  fxvalue=xmin+(float)(xmax-xmin)/(float)(letim-lbtim)*
1140  (float)(letim-stim);
1141 
1142  svalue=values[i].value;
1143 
1144  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
1145  (float)(svalue-minv);
1146 
1147  yvalue=fyvalue+.5;
1148  xvalue=fxvalue+.5;
1149  oqual=values[i].qual;
1150 
1151  dxvalue=-(float)(xmax-xmin)/(float)(letim-lbtim)*
1152  (float)(3600*save_rec[k].volume);
1153 
1154  dvalue=dxvalue+.5;
1155 
1156  if(dvalue < 2)
1157  dvalue=2;
1158 
1159  if(ymax - yvalue == 0 && i > 0) {
1160 
1161 
1162  if(oqual == 'S' || oqual == 'V' ||
1163  oqual == 'A' || oqual == 'B')
1164  XSetForeground(display,gc1,mmap[7]);
1165 
1166  else if(oqual == 'F' || oqual == 'X')
1167  XSetForeground(display,gc1,mmap[9]);
1168 
1169  else if(oqual == 'D' || oqual == 'E' || oqual=='O')
1170  XSetForeground(display,gc1,mmap[10]);
1171 
1172  else if(oqual == 'Q' || oqual == 'C' )
1173  XSetForeground(display,gc1,mmap[11]);
1174 
1175  else
1176  XSetForeground(display,gc1,mmap[3]);
1177 
1178  XDrawLine(display,bwindow[m],gc1,xvalue-dvalue,ymax,
1179  xvalue,ymax);
1180 
1181  }
1182 
1183  else {
1184 
1185  if(ymax-yvalue==0)
1186  XSetForeground(display,gc1,mmap[3]);
1187 
1188  else if(oqual == 'S' || oqual == 'V' ||
1189  oqual == 'A' || oqual == 'B')
1190  XSetForeground(display,gc1,mmap[7]);
1191 
1192  else if(oqual == 'F' || oqual == 'X')
1193  XSetForeground(display,gc1,mmap[9]);
1194 
1195  else if(oqual == 'D' || oqual == 'E' || oqual=='O')
1196  XSetForeground(display,gc1,mmap[10]);
1197 
1198  else if(oqual == 'Q' || oqual == 'C' )
1199  XSetForeground(display,gc1,mmap[11]);
1200 
1201  else
1202  XSetForeground(display,gc1,mmap[3]);
1203 
1204  if(oxvalue != -1) {
1205 
1206  if(xvalue >= oxvalue)
1207  xvalue=oxvalue-1;
1208 
1209  }
1210 
1211  XFillRectangle(display,bwindow[m],gc1,
1212  xvalue-dvalue,yvalue,
1213  dvalue-1,ymax-yvalue+1);
1214 
1215  oxvalue=xvalue-dvalue;
1216 
1217 
1218  }
1219  xvalue1=xvalue;
1220  yvalue1=yvalue;
1221  otim=stim;
1222 
1223 
1224  }
1225 
1226  }
1227 
1228 else {
1229 
1230 for(i=0;i<inum;i++) {
1231 
1232  tm.tm_year=values[i].zdate/10000-1900;
1233  tm.tm_mon=(values[i].zdate-(tm.tm_year+1900)*10000)/100;
1234  tm.tm_mday=values[i].zdate-(tm.tm_year+1900)*10000-tm.tm_mon*100;
1235  tm.tm_hour=values[i].ztime/10000;
1236  tm.tm_min=(values[i].ztime-tm.tm_hour*10000)/100;
1237 
1238  tm.tm_mon=tm.tm_mon;
1239  stim=ouptime(tm.tm_year+1900,tm.tm_mon,tm.tm_mday,tm.tm_hour,tm.tm_min,0);
1240 
1241  fxvalue=xmin+(float)(xmax-xmin)/(float)(letim-lbtim)*
1242  (float)(letim-stim);
1243 
1244  svalue=values[i].value;
1245 
1246  if(ilinear==1 &&
1247  save_rec[k].rate_table.AryMax >= 0) {
1248  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
1249  values[i].zdate,
1250  (double)svalue,
1251  &ierr);
1252 
1253  svalue=(double)flow;
1254 
1255  }
1256 
1257  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
1258  (float)(svalue-minv);
1259 
1260  yvalue=fyvalue;
1261  xvalue=fxvalue;
1262 
1263  if(oqual == 'S' || oqual == 'V' ||
1264  oqual == 'A' || oqual == 'B')
1265  XSetForeground(display,gc1,mmap[7]);
1266 
1267  else if(oqual == 'F' || oqual == 'X')
1268  XSetForeground(display,gc1,mmap[9]);
1269 
1270  else if(oqual == 'D' || oqual == 'E' || oqual=='O')
1271  XSetForeground(display,gc1,mmap[10]);
1272 
1273  else if(oqual == 'Q' || oqual == 'C' )
1274  XSetForeground(display,gc1,mmap[11]);
1275 
1276  else
1277  XSetForeground(display,gc1,mmap[3]);
1278 
1279  if(i > 0) {
1280 
1281  if(otim-stim < 7200L)
1282  XDrawLine(display,bwindow[m],gc1,xvalue,yvalue,
1283  xvalue1,yvalue1);
1284 
1285  else {
1286 
1287  XDrawArc(display,bwindow[m],gc1,xvalue1-2,yvalue1-2,
1288  4,4,0,360*64);
1289  XDrawArc(display,bwindow[m],gc1,xvalue-2,yvalue-2,
1290  4,4,0,360*64);
1291  }
1292 
1293  }
1294 
1295  xvalue1=xvalue;
1296  yvalue1=yvalue;
1297  otim=stim;
1298  oqual=values[i].qual;
1299 
1300  }
1301 
1302 }
1303 
1304 XSetForeground(display,gc1,mmap[5]);
1305 
1306 if(save_rec[k].qolume!= 0) {
1307 
1308  for(i=0;i<qnum;i++) {
1309 
1310  tm.tm_year=qalues[i].zdate/10000-1900;
1311  tm.tm_mon=(qalues[i].zdate-(tm.tm_year+1900)*10000)/100;
1312  tm.tm_mday=qalues[i].zdate-(tm.tm_year+1900)*10000-tm.tm_mon*100;
1313  tm.tm_hour=qalues[i].ztime/10000;
1314  tm.tm_min=(qalues[i].ztime-tm.tm_hour*10000)/100;
1315 
1316  tm.tm_mon=tm.tm_mon;
1317  stim=ouptime(tm.tm_year+1900,tm.tm_mon,tm.tm_mday,
1318  tm.tm_hour,tm.tm_min,0);
1319 
1320  fxvalue=xmin+(float)(xmax-xmin)/(float)(letim-lbtim)*
1321  (float)(letim-stim);
1322 
1323  svalue=qalues[i].value;
1324 
1325  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
1326  (float)(svalue-minv);
1327 
1328  yvalue=fyvalue+.5;
1329  xvalue=fxvalue+.5;
1330 
1331  dxvalue=-(float)(xmax-xmin)/(float)(letim-lbtim)*
1332  (float)(3600*save_rec[k].volume);
1333 
1334  dvalue=dxvalue+.5;
1335 
1336  if(dvalue < 2)
1337  dvalue=2;
1338 
1339  if(ymax - yvalue == 0 && i > 0) {
1340 
1341  if(oqual != 'S' && oqual != 'V')
1342  XSetForeground(display,gc1,mmap[9]);
1343 
1344  else
1345  XSetForeground(display,gc1,mmap[5]);
1346 
1347  XDrawLine(display,bwindow[m],gc1,xvalue-dvalue,ymax,
1348  xvalue,ymax);
1349 
1350  }
1351 
1352  else {
1353 
1354  if(ymax-yvalue==0)
1355  XSetForeground(display,gc1,mmap[3]);
1356 
1357  else
1358  XSetForeground(display,gc1,mmap[5]);
1359 
1360  XFillRectangle(display,bwindow[m],gc1,
1361  xvalue-dvalue,yvalue,
1362  dvalue-1,ymax-yvalue+1);
1363 
1364 
1365  }
1366  xvalue1=xvalue;
1367  yvalue1=yvalue;
1368  otim=stim;
1369  oqual=qalues[i].qual;
1370 
1371  }
1372 
1373  }
1374 
1375 else {
1376 
1377 for(i=0;i<qnum;i++) {
1378 
1379  tm.tm_year=qalues[i].zdate/10000-1900;
1380  tm.tm_mon=(qalues[i].zdate-(tm.tm_year+1900)*10000)/100;
1381  tm.tm_mday=qalues[i].zdate-(tm.tm_year+1900)*10000-tm.tm_mon*100;
1382  tm.tm_hour=qalues[i].ztime/10000;
1383  tm.tm_min=(qalues[i].ztime-tm.tm_hour*10000)/100;
1384 
1385  tm.tm_mon=tm.tm_mon;
1386  stim=ouptime(tm.tm_year+1900,tm.tm_mon,tm.tm_mday,tm.tm_hour,tm.tm_min,0);
1387 
1388  fxvalue=xmin+(float)(xmax-xmin)/(float)(letim-lbtim)*
1389  (float)(letim-stim);
1390 
1391  svalue=qalues[i].value;
1392 
1393  if(ilinear==1 &&
1394  save_rec[k].rate_table.AryMax >= 0) {
1395  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
1396  values[i].zdate,
1397  (double)svalue,
1398  &ierr);
1399 
1400  svalue=(double)flow;
1401 
1402  }
1403 
1404  fyvalue=ymax-(float)(ymin-ymax)/(float)(minv-maxv)*
1405  (float)(svalue-minv);
1406 
1407  yvalue=fyvalue;
1408  xvalue=fxvalue;
1409 
1410  if(oqual != 'S' && oqual != 'V')
1411  XSetForeground(display,gc1,mmap[9]);
1412 
1413  else
1414  XSetForeground(display,gc1,mmap[5]);
1415 
1416  if(i > 0) {
1417 
1418  if(otim-stim < 7200L)
1419  XDrawLine(display,bwindow[m],gc1,xvalue,yvalue,
1420  xvalue1,yvalue1);
1421 
1422  else {
1423 
1424  XDrawArc(display,bwindow[m],gc1,xvalue1-2,yvalue1-2,
1425  4,4,0,360*64);
1426  XDrawArc(display,bwindow[m],gc1,xvalue-2,yvalue-2,
1427  4,4,0,360*64);
1428  }
1429 
1430  }
1431 
1432  xvalue1=xvalue;
1433  yvalue1=yvalue;
1434  otim=stim;
1435  oqual=qalues[i].qual;
1436 
1437  }
1438 
1439 }
1440 
1441 
1442 XSetForeground(display,gc1,mmap[7]);
1443 if(save_rec[k].rate_table.AryMax >= 0)
1444  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
1445  values[0].zdate,
1446  (double)max_min.max,
1447  &ierr);
1448 
1449 sprintf(buf,"Max=%6.1f",max_min.max);
1450 
1451 if(save_rec[k].rate_table.AryMax >= 0) {
1452 
1453  sprintf(abuf," %d",flow);
1454  strcat(buf,abuf);
1455 
1456  }
1457 
1458 sprintf(abuf," at %02d/%02d/%02d %02dZ",
1459  max_min.tmx.tm_mon,max_min.tmx.tm_mday,max_min.tmx.tm_year,
1460  max_min.tmx.tm_hour);
1461 
1462 strcat(buf,abuf);
1463 
1464 XDrawString(display,bwindow[m],gc1,xs+xparm1,ys+yparm1-yheight*(2+aflag),
1465  buf,strlen(buf));
1466 
1467 
1468 if(save_rec[k].rate_table.AryMax >= 0)
1469  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
1470  values[0].zdate,
1471  (double)max_min.min,
1472  &ierr);
1473 
1474 sprintf(buf,"Min=%6.1f",max_min.min);
1475 
1476 if(save_rec[k].rate_table.AryMax >= 0) {
1477 
1478  sprintf(abuf," %d",flow);
1479  strcat(buf,abuf);
1480 
1481  }
1482 
1483 sprintf(abuf," at %02d/%02d/%02d %02dZ",
1484  max_min.tmn.tm_mon,max_min.tmn.tm_mday,max_min.tmn.tm_year,
1485  max_min.tmn.tm_hour);
1486 
1487 strcat(buf,abuf);
1488 XDrawString(display,bwindow[m],gc1,xs+xparm1,ys+yparm1-yheight*(1+aflag),
1489  buf,strlen(buf));
1490 
1491 
1492 if(qnum != 0) {
1493 
1494 XSetForeground(display,gc1,mmap[5]);
1495 if(save_rec[k].rate_table.AryMax >= 0)
1496  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
1497  values[0].zdate,
1498  (double)max_min2.max,
1499  &ierr);
1500 
1501 sprintf(buf,"Max=%6.1f",max_min2.max);
1502 
1503 if(save_rec[k].rate_table.AryMax >= 0) {
1504 
1505  sprintf(abuf," %d",flow);
1506  strcat(buf,abuf);
1507 
1508  }
1509 
1510 sprintf(abuf," at %02d/%02d/%02d %02dZ",
1511  max_min2.tmx.tm_mon,max_min2.tmx.tm_mday,max_min2.tmx.tm_year,
1512  max_min2.tmx.tm_hour);
1513 
1514 strcat(buf,abuf);
1515 
1516 XDrawString(display,bwindow[m],gc1,xs+xparm1,ys+yparm1-yheight*2,
1517  buf,strlen(buf));
1518 
1519 
1520 if(save_rec[k].rate_table.AryMax >= 0)
1521  flow=GetFlow(save_rec[k].stn_rec.id,'H',pe2,
1522  values[0].zdate,
1523  (double)max_min2.min,
1524  &ierr);
1525 
1526 sprintf(buf,"Min=%6.1f",max_min2.min);
1527 
1528 if(save_rec[k].rate_table.AryMax >= 0) {
1529 
1530  sprintf(abuf," %d",flow);
1531  strcat(buf,abuf);
1532 
1533  }
1534 
1535 sprintf(abuf," at %02d/%02d/%02d %02dZ",
1536  max_min2.tmn.tm_mon,max_min2.tmn.tm_mday,max_min2.tmn.tm_year,
1537  max_min2.tmn.tm_hour);
1538 
1539 strcat(buf,abuf);
1540 XDrawString(display,bwindow[m],gc1,xs+xparm1,ys+yparm1-yheight*1,
1541  buf,strlen(buf));
1542 
1543 }
1544 
1545 save_rec[k].is_realized=1;
1546 
1547 }
1548 
1549 struct max_min get_max_min(struct stn_values *stn_values,int inum)
1550 
1551 {
1552 
1553 struct max_min max_min;
1554 int i,xdate,xtime,ndate,ntime;
1555 double abs1,abs2;
1556 
1557 max_min.max=-999999;
1558 max_min.min= 999999;
1559 
1560 for(i=0;i<inum;i++) {
1561 
1562  if(stn_values[i].value > max_min.max) {
1563 
1565  xdate=stn_values[i].zdate;
1567 
1568  }
1569 
1570  if(stn_values[i].value < max_min.min) {
1571 
1573  ndate=stn_values[i].zdate;
1574  ntime=stn_values[i].ztime;
1575 
1576  }
1577 
1578 
1579  }
1580 
1581 max_min.tmx.tm_year=xdate/10000-1900;
1582 max_min.tmx.tm_mon=(xdate-(max_min.tmx.tm_year+1900)*10000)/100;
1583 max_min.tmx.tm_mday=xdate-(max_min.tmx.tm_year+1900)*10000-max_min.tmx.tm_mon*100;
1584 max_min.tmx.tm_hour=xtime/10000;
1585 max_min.tmx.tm_min=(xtime-max_min.tmx.tm_hour*10000)/100;
1586 max_min.tmx.tm_mon=max_min.tmx.tm_mon;
1587 
1588 max_min.tmn.tm_year=ndate/10000-1900;
1589 max_min.tmn.tm_mon=(ndate-(max_min.tmn.tm_year+1900)*10000)/100;
1590 max_min.tmn.tm_mday=ndate-(max_min.tmn.tm_year+1900)*10000-max_min.tmn.tm_mon*100;
1591 max_min.tmn.tm_hour=ntime/10000;
1592 max_min.tmn.tm_min=(ntime-max_min.tmn.tm_hour*10000)/100;
1593 max_min.tmn.tm_mon=max_min.tmn.tm_mon;
1594 
1595 return(max_min);
1596 
1597 }
1598 
1599 int get_delta_time(time_t lbtim,time_t letim)
1600 
1601 {
1602 
1603 int hours,dhours;
1604 
1605 hours=(lbtim-letim)/3600L;
1606 
1607 if(hours < 24)
1608  dhours=1;
1609 
1610 else if(hours < 96)
1611  dhours=3;
1612 
1613 else if(hours < 144)
1614  dhours=6;
1615 
1616 else if(hours < 288)
1617  dhours=24;
1618 
1619 else if(hours < 576)
1620  dhours=48;
1621 
1622 else if(hours < 1152)
1623  dhours=72;
1624 
1625 else if(hours < 2304)
1626  dhours=96;
1627 
1628 else if(hours < 4608)
1629  dhours=192;
1630 
1631 else
1632  dhours=30*24;
1633 
1634 return(dhours);
1635 
1636 }
1637 
1638 float get_delta_valu(int diff)
1639 
1640 {
1641 
1642 float dval;
1643 
1644 if(diff <= 1)
1645  dval=.1;
1646 
1647 else if(diff < 4)
1648  dval=.2;
1649 
1650 else if(diff < 10)
1651  dval=.5;
1652 
1653 else if(diff < 20)
1654  dval=1;
1655 
1656 else if(diff < 40)
1657  dval=2;
1658 
1659 else if(diff < 100)
1660  dval=5;
1661 
1662 else if(diff < 200)
1663  dval=10;
1664 
1665 else if(diff < 400)
1666  dval=20;
1667 
1668 else if(diff < 1000)
1669  dval=50;
1670 
1671 else if(diff < 2000)
1672  dval=100;
1673 
1674 else if(diff < 4000)
1675  dval=200;
1676 
1677 else if(diff < 10000)
1678  dval=500;
1679 
1680 else if(diff < 20000)
1681  dval=1000;
1682 
1683 else if(diff < 40000)
1684  dval=2000;
1685 
1686 else if(diff < 100000)
1687  dval=5000;
1688 
1689 else if(diff < 200000)
1690  dval=10000;
1691 
1692 else if(diff < 400000)
1693  dval=20000;
1694 
1695 else if(diff < 1000000)
1696  dval=50000;
1697 
1698 else if(diff < 2000000)
1699  dval=100000;
1700 
1701 else if(diff < 4000000)
1702  dval=200000;
1703 
1704 else
1705  dval=1000000;
1706 
1707 return(dval);
1708 
1709 }
1710 
1711 
1712 void options_draw(Widget w,XtPointer data,XmDrawingAreaCallbackStruct *call_data)
1713 
1714 {
1715 
1716 int k,j;
1717 Dimension width,height;
1718 Arg args[10];
1719 
1720 j=(int)data/100;
1721 
1722 k=(int)data-j*100;
1723 
1724 if(k==0)
1725  linear=0;
1726 
1727 if(k==1)
1728  linear=1;
1729 
1730 if(k==2)
1731  scale=0;
1732 
1733 if(k==3)
1734  scale=1;
1735 
1736 XtSetArg(args[0],XtNwidth,&width);
1737 XtSetArg(args[1],XtNheight,&height);
1738 XtGetValues(bdrawing_area[j],args,2);
1739 
1740 XSetFunction(display,gc1,GXcopy);
1741 XSetForeground(display,gc1,mmap[0]);
1742 XSetBackground(display,gc1,mmap[0]);
1743 XFillRectangle(display,bwindow[j],gc1,0,0,width,height);
1744 
1745 draw_area(j,j,0,0,width,height);
1746 
1747 }
1748 
1749 void quit_draw(Widget w,XtPointer data,XmDrawingAreaCallbackStruct *call_data)
1750 
1751 {
1752 
1753 int k;
1754 
1755 k=(int)data;
1756 
1757 
1758 XtDestroyWidget(bdrawing_area[k]);
1759 XtDestroyWidget(draw_dialog[k]);
1760 
1761 draw_dialog[k]=0;
1762 save_rec[k].inum=-1;
1763 
1764 }
1765 
1766 void bhandle_expose(Widget w,XtPointer data,XmDrawingAreaCallbackStruct *call_data)
1767 
1768 {
1769 
1770 int k;
1771 Dimension width,height;
1772 Arg args[10];
1773 
1774 k=(int)data;
1775 
1776 XtSetArg(args[0],XtNwidth,&width);
1777 XtSetArg(args[1],XtNheight,&height);
1778 XtGetValues(bdrawing_area[k],args,2);
1779 
1780 XSetFunction(display,gc1,GXcopy);
1781 XSetForeground(display,gc1,mmap[0]);
1782 XSetBackground(display,gc1,mmap[0]);
1783 
1784 XFillRectangle(display,bwindow[k],gc1,0,0,
1786 
1787 if(save_rec[k].is_realized==1)
1788  draw_area(k,k,0,0,width,height);
1789 
1790 
1791 }
1792 
1793 void get_units(char *ibuf,char *sbuf)
1794 
1795 {
1796 
1797  if(strncasecmp("P",ibuf,1)==0 ||
1798  strncasecmp("S",ibuf,1)==0)
1799  strcpy(sbuf,"INCHES");
1800 
1801  else if(strncasecmp("T",ibuf,1)==0)
1802  strcpy(sbuf,"DEGREES F");
1803 
1804  else if(strncasecmp("X",ibuf,1)==0)
1805  strcpy(sbuf,"PERCENT");
1806 
1807  else if(strncasecmp("H",ibuf,1)==0)
1808  strcpy(sbuf,"FEET");
1809 
1810  else if(strncasecmp("L",ibuf,1)==0)
1811  strcpy(sbuf,"KAC-FT");
1812 
1813  else if(strncasecmp("Q",ibuf,1)==0 && strlen(ibuf) > 3 &&
1814  strncasecmp("M",&ibuf[2],1)==0)
1815  strcpy(sbuf,"KAC-FT");
1816 
1817  else if(strncasecmp("Q",ibuf,1)==0 && strlen(ibuf) > 3 &&
1818  strncasecmp("D",&ibuf[2],1)==0)
1819  strcpy(sbuf,"KAC-FT");
1820 
1821  else if(strncasecmp("QRD1Z",ibuf,5)==0)
1822  strcpy(sbuf,"KCFS");
1823 
1824  else if(strncasecmp("Q",ibuf,1)==0)
1825  strcpy(sbuf,"CFS");
1826 
1827  else if(strncasecmp("US",ibuf,2)==0)
1828  strcpy(sbuf,"MILES PER HOUR");
1829 
1830  else if(strncasecmp("UD",ibuf,2)==0)
1831  strcpy(sbuf,"DEGREES");
1832 
1833 
1834  else
1835  strcpy(sbuf,"VALUE");
1836 
1837 }
1838 
1839 
1840 void get_acronym(char *ibuf,char *sbuf)
1841 
1842 {
1843 
1844  sbuf[0]=0;
1845  if(strncasecmp("HG",ibuf,2)==0)
1846  strcat(sbuf,"RIVER STAGE");
1847 
1848  else if(strncasecmp("HP",ibuf,2)==0)
1849  strcat(sbuf,"RESERVOIR POOL ELEVATION");
1850 
1851  else if(strncasecmp("LS",ibuf,2)==0)
1852  strcat(sbuf,"LAKE STORAGE");
1853 
1854  else if(strncasecmp("PC",ibuf,2)==0)
1855  strcat(sbuf,"PRECIPITATION ACCUMULATION");
1856 
1857  else if(strncasecmp("PP",ibuf,2)==0)
1858  strcat(sbuf,"PRECIPITATION INCREMENTAL");
1859 
1860  else if(strncasecmp("QC",ibuf,2)==0)
1861  strcat(sbuf,"RUNOFF VOLUME");
1862 
1863  else if(strncasecmp("QD",ibuf,2)==0)
1864  strcat(sbuf,"DISCHARGE-DIVERSION");
1865 
1866  else if(strncasecmp("QI",ibuf,2)==0)
1867  strcat(sbuf,"DISCHARGE-INFLOW");
1868 
1869  else if(strncasecmp("QR",ibuf,2)==0)
1870  strcat(sbuf,"DISCHARGE-RIVER");
1871 
1872  else if(strncasecmp("QT",ibuf,2)==0)
1873  strcat(sbuf,"DISCHARGE-OUTFLOW");
1874 
1875  else if(strncasecmp("SD",ibuf,2)==0)
1876  strcat(sbuf,"SNOW DEPTH");
1877 
1878  else if(strncasecmp("SW",ibuf,2)==0)
1879  strcat(sbuf,"SNOW WATER EQUIVALENT");
1880 
1881  else if(strncasecmp("TA",ibuf,2)==0)
1882  strcat(sbuf,"AIR TEMPERATURE");
1883 
1884  else if(strncasecmp("US",ibuf,2)==0)
1885  strcat(sbuf,"WIND SPEED");
1886 
1887  else if(strncasecmp("UD",ibuf,2)==0)
1888  strcat(sbuf,"WIND DIRECTION");
1889 
1890  else if(strncasecmp("UQ",ibuf,2)==0)
1891  strcat(sbuf,"WIND SPEED/DIRECTION");
1892 
1893  else if(strncasecmp("XR",ibuf,2)==0)
1894  strcat(sbuf,"RELATIVE HUMIDITY");
1895 
1896  else
1897  strcat(sbuf,"UNKNOWN");
1898 
1899  strcat(sbuf,",");
1900 
1901  if(strncasecmp("I",&ibuf[2],1)==0)
1902  strcat(sbuf,"INSTANTANEOUS");
1903 
1904  else if(strncasecmp("D",&ibuf[2],1)==0)
1905  strcat(sbuf,"DAILY");
1906 
1907  else if(strncasecmp("Q",&ibuf[2],1)==0)
1908  strcat(sbuf,"SIX HOURLY");
1909 
1910  else if(strncasecmp("M",&ibuf[2],1)==0)
1911  strcat(sbuf,"MONTHLY");
1912 
1913  else
1914  strcat(sbuf,"UNKNOWN");
1915 
1916  strcat(sbuf,",");
1917 
1918  if(strncasecmp("R",&ibuf[3],1)==0)
1919  strcat(sbuf,"OBSERVED");
1920 
1921  else if(strncasecmp("P",&ibuf[3],1)==0)
1922  strcat(sbuf,"PROCESSED");
1923 
1924  else if(strncasecmp("1",&ibuf[3],1)==0)
1925  strcat(sbuf,"PROCESSED LEVEL 1");
1926 
1927  else if(strncasecmp("2",&ibuf[3],1)==0)
1928  strcat(sbuf,"PROCESSED LEVEL 2");
1929 
1930  else if(strncasecmp("F",&ibuf[3],1)==0)
1931  strcat(sbuf,"FORECAST");
1932 
1933  else
1934  strcat(sbuf,"UNKNOWN");
1935 
1936  strcat(sbuf,",");
1937 
1938  if(strncasecmp("Z",&ibuf[4],1)==0)
1939  strcat(sbuf,"STP/SAO");
1940 
1941  else if(strncasecmp("G",&ibuf[4],1)==0)
1942  strcat(sbuf,"GOES");
1943 
1944  else if(strncasecmp("M",&ibuf[4],1)==0)
1945  strcat(sbuf,"METEOR");
1946 
1947  else if(strncasecmp("P",&ibuf[4],1)==0)
1948  strcat(sbuf,"PHONE");
1949 
1950  else if(strncasecmp("R",&ibuf[4],1)==0)
1951  strcat(sbuf,"RADIO");
1952 
1953  else
1954  strcat(sbuf,"UNKNOWN");
1955 
1956  if(strncasecmp("Z",&ibuf[5],1)!=0)
1957  strcat(sbuf,",");
1958 
1959  if(strncasecmp("X",&ibuf[5],1)==0)
1960  strcat(sbuf,"MAXIMUM:DAILY");
1961 
1962  else if(strncasecmp("N",&ibuf[5],1)==0)
1963  strcat(sbuf,"MINIMUM:DAILY");
1964 
1965  if(strncasecmp("Z",&ibuf[6],1)!=0)
1966  strcat(sbuf,", ");
1967 
1968  if(strncasecmp("F",&ibuf[6],1)==0)
1969  strcat(sbuf,".05");
1970 
1971  else if(strncasecmp("N",&ibuf[6],1)==0)
1972  strcat(sbuf,".95");
1973 
1974  return;
1975 
1976 }
1977 /*
1978 void to_stage(char *hb5,char pe1,char pe2,struct stn_values *stn_values,int inum)
1979 
1980 {
1981 
1982 int i;
1983 int ierr;
1984 int qflow;
1985 double qstage;
1986 
1987 for(i=0;i<inum;i++) {
1988 
1989  qflow=stn_values[i].value*1000;
1990  qstage=GetStage(hb5,pe1,pe2,stn_values[i].zdate,
1991  qflow,&ierr);
1992 
1993  stn_values[i].value=qstage;
1994 
1995  }
1996 
1997 return;
1998 
1999 }
2000 
2001 Widget BuildPulldownToggleMenu(Widget parent,char *menu_title,char menu_mnemonic,struct MenuItem *items)
2002 
2003 
2004 {
2005 
2006  Widget Pulldown, button;
2007  int i;
2008  int argcount;
2009  Arg args[10];
2010 
2011  argcount=0;
2012 
2013  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
2014  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
2015  Pulldown=XmCreatePulldownMenu(parent,"pulldown",args,argcount);
2016  XtSetArg(args[argcount],XmNselectColor,mmap[4]);argcount++;
2017 
2018  for(i=0;items[i].label!=NULL;i++) {
2019 
2020  button=XmCreateToggleButton(Pulldown,items[i].label,args,argcount);
2021  XtAddCallback(button,XmNvalueChangedCallback,items[i].callback,items[i].callback_data);
2022 
2023  XtManageChild(button);
2024 
2025  }
2026 
2027  return(Pulldown);
2028 
2029 }
2030 
2031 Widget BuildPulldownPushMenu(Widget parent,char *menu_title,char menu_mnemonic,struct MenuItem *items)
2032 
2033 
2034 {
2035 
2036  Widget Pulldown, button;
2037  int i;
2038  int argcount;
2039  Arg args[10];
2040 
2041  argcount=0;
2042 
2043  XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
2044  XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
2045  Pulldown=XmCreatePulldownMenu(parent,"pulldown",args,argcount);
2046 
2047  for(i=0;items[i].label!=NULL;i++) {
2048 
2049  button=XmCreatePushButton(Pulldown,items[i].label,args,argcount);
2050  XtAddCallback(button,XmNactivateCallback,items[i].callback,
2051  items[i].callback_data);
2052  XtManageChild(button);
2053 
2054  }
2055 
2056 return(Pulldown);
2057 
2058 }
2059 
2060 Widget AttachToCascade(Widget parent, char *label,Widget sub_menu)
2061 
2062 {
2063 Arg args[10];
2064 Cardinal argcount;
2065 Widget cbutton;
2066 
2067 argcount=0;
2068 XtSetArg(args[argcount],XmNsubMenuId,sub_menu);argcount++;
2069 XtSetArg(args[argcount],XmNbackground,mmap[1]);argcount++;
2070 XtSetArg(args[argcount],XmNforeground,mmap[0]);argcount++;
2071 cbutton=XmCreateCascadeButton(parent,label,args,argcount);
2072 XtManageChild(cbutton);
2073 return(cbutton);
2074 
2075 }
2076 
2077 */
static int i
char fbuf[100]
Definition: decode_HDP.c:2
void bhandle_expose()
int get_delta_time(time_t lbtim, time_t letim)
int hour
Widget bmain_window
Definition: mapper.c:181
XFontStruct * info_font[10]
Definition: mapper.c:195
unsigned long mmap[16]
Definition: mapper.c:117
struct max_min get_max_min(struct stn_values *stn_values, int inum)
int display_method
Definition: subdisplay.c:34
GC gc1
Definition: subdisplay.c:51
int max_height
Widget top_level
Definition: display_rec.c:5
struct stn_values * stn_values
Definition: mapper.c:124
int scale
Widget draw_dialog[10]
Definition: mapper.c:180
int day
int bmax_width
int days
void get_new_values()
int linear
void draw_area(int k, int m, int xs, int ys, int xz, int yz)
int bmax_height
Widget bdrawing_area[10]
Definition: mapper.c:182
Window bwindow[20]
Definition: mapper.c:189
void get_units(char *ibuf, char *sbuf)
Display * display
Definition: mapper.c:159
Font font[10]
Definition: mapper.c:161
int max_width
Definition: mapper.c:99
int init_subdisplay
Definition: mapper.c:48
int year
Window root_win
char qual[10]
Definition: subdisplay.c:33
void get_acronym(char *ibuf, char *sbuf)
void quit_draw()
int month
float get_delta_valu(int diff)
void options_draw()
void display_data(char *hb5, char *pc, int dmonth, int dday, int dyear, int dhour, int ddays, char *fname)
void berror(Widget widget, char *string)
Definition: display_rec.c:392
Widget text
Definition: display_rec.c:5
char values[]
Definition: ffg.c:44
struct stat buf
Definition: is_file_closed.c:8
long ouptime(int year, int month, int day, int hour, int minute, int second)
Definition: ouptime.c:10
Widget AttachToCascade(Widget, char *, Widget)
Definition: mapper.c:771
Widget BuildPulldownPushMenu(Widget, char *, char, struct MenuItem *)
Definition: mapper.c:747
int GetFlow(char *, char, char, int, double, int *)
Definition: rat.c:1746
double GetStage(char *, char, char, int, int, int *)
Definition: rat.c:2110
static RatingTable rate_table
Definition: rat.c:131
fclose(fp)
sprintf(fbuf,"/usr/mapper/nexrad/ngrid.%02d-%02d-%02d-%02d", year, month, day, hour)
fp
Definition: make_NEXRAD.c:339
system(tarbuf)
int j
Definition: mapp2h.h:48
int k
Definition: mapp2h.h:48
struct dval dval
Definition: mapper.c:148
Widget menu_bar
Definition: mapper.c:185
time_t xtime[500]
Definition: mapper.c:150
long xmax
float value
long ymax
Dimension height
Dimension width
int yheight
Arg args[10]
long xmin
long ymin
char fname[100]
Definition: send_afos.c:6
Definition: misc.h:459
char * label
Definition: misc.h:461
void(* callback)()
Definition: misc.h:463
XtPointer callback_data
Definition: misc.h:464
double HMax
Definition: rate_table.h:16
double RatStg[100]
Definition: rate_table.h:12
double wrn
Definition: rate_table.h:20
double fld
Definition: rate_table.h:21
Definition: misc.h:470
Definition: misc.h:61
struct tm tmx
Definition: misc.h:65
float min
Definition: misc.h:64
float max
Definition: misc.h:63
struct tm tmn
Definition: misc.h:66
Definition: misc.h:213
struct stim btim
Definition: misc.h:219
RatingTable rate_table
Definition: misc.h:217
struct stim etim
Definition: misc.h:220
char parm[10]
Definition: misc.h:216
int volume
Definition: misc.h:222
int is_realized
Definition: misc.h:223
int inum
Definition: misc.h:221
Definition: misc.h:93
int day
Definition: misc.h:97
int year
Definition: misc.h:95
int hour
Definition: misc.h:98
int month
Definition: misc.h:96
Definition: misc.h:135
char id[6]
Definition: misc.h:137
char des[51]
Definition: misc.h:139
char qual
Definition: hydro_data.h:36
float value
Definition: hydro_data.h:35
struct stim btim
Definition: subdisplay.c:30
struct stim etim
Definition: subdisplay.c:31
tim()
Definition: tim.c:4