📄 xpicker.c
字号:
for(i=0;i<*pickdimax;i++) { if((*apick)[i].picked) { if (x1x2==0) { fprintf(fp,"%f %f\n",(*apick)[i].x2,(*apick)[i].time); } else { fprintf(fp,"%f %f\n",(*apick)[i].time,(*apick)[i].x2); } } } fclose(fp); warn("Pick output successful");}void load_picks(pick_t **apick, int num_wiggles, char *fname, int *pickdimax, int *pickdimend, int verbose, int x1x2){ FILE *fp; int i,num_picks = num_wiggles/*dummy*/; float xval,time; if((fp=fopen(fname,"r+")) == NULL) err("Could not open pick input file '%s'",fname); /* fscanf(fp,"%d\n",&num_picks); *//* dynamically reallocate memory for picks if necessary - Bill Lutter */ realloc_picks(apick, num_picks, pickdimax, pickdimend,verbose); for(i=0;i<num_picks;i++) { ++*pickdimend; if (x1x2==0) { fscanf(fp,"%f %f\n",&xval,&time); } else { fscanf(fp,"%f %f\n",&time,&xval); } (*apick)[*pickdimend-1].picked=TRUE; (*apick)[*pickdimend-1].x2=xval; (*apick)[*pickdimend-1].time=time; printf("load: %d %f %f %d \n",*pickdimend,(*apick)[*pickdimend-1].x2, (*apick)[*pickdimend-1].time,(*apick)[*pickdimend-1].picked); } printf("load: end %d max %d \n",*pickdimend,*pickdimax); fclose(fp); warn("Pick input successful");}void edit_pick(Display *dpy, Window win, GC gc, XEvent event, int style, int x, int y, int width, int height, pick_t **apick, int num_wiggles, float x1begb, float x1endb, float x2begb, float x2endb, float p2beg, float p2end, int control_mode, int edit_mode, int cross_mode, int *pickdimax, int *pickdimend, int ioff, float *off, int verbose){ int done=FALSE; float fy; int oldy=num_wiggles/*dummy*/; int pick_num; int pick_x; float scale,base;/* Added by bill Lutter */ int ihead = -1; if((control_mode==PICK_MODE) && (event.xbutton.x > x) && (event.xbutton.x < x+width) && (event.xbutton.y > y) && (event.xbutton.y < y+height)) { if(edit_mode==DELETE_MODE) { pick_num = (int)(p2beg+x2begb+(p2end+x2endb-x2begb-p2beg)* (event.xbutton.x-x)/width+0.5); fy=x1begb+(x1endb-x1begb)*(event.xbutton.y-y)/height;/* existence of x2file= file with x-axis header values is indicated by positive values of "ioff". If file does not exist then ioff is negative. Then use mouse derived x-axis value for pick. */ del_pick(apick, pickdimax, pickdimend, off, ioff, fy, &pick_num, &ihead,verbose); if ( ihead >= 0 && ihead < *pickdimend ) { if((*apick)[ihead].picked) { draw_pick(dpy,win,red_r_gc,*apick,ihead, x,y, width,height, x1begb, x1endb, x2begb,x2endb, p2beg,p2end); (*apick)[ihead].picked=FALSE; } } } else { fy=x1begb+(x1endb-x1begb)*(event.xbutton.y-y)/height; pick_num = (int)(p2beg+x2begb+(p2end+x2endb-x2begb-p2beg)* (event.xbutton.x-x)/width+0.5); add_pick(apick, pickdimax, pickdimend, off, ioff, fy, &pick_num, &ihead,verbose); /* if((*apick)[pick_num-1].picked) { draw_pick(dpy,win,red_r_gc,*apick,pick_num, x,y, width,height, x1begb,x1endb, x2begb,x2endb, p2beg,p2end); } */ scale = width/(x2endb+p2end-x2begb-p2beg); base = x-scale*(x2begb+p2beg); pick_x = base+scale*pick_num-0.5; oldy=event.xbutton.y; draw_seg(dpy,win,gc,pick_x,oldy); xMouseLoc(dpy,win,event,style,True, x,y,width,height,x1begb,x1endb, x2begb,x2endb,p2beg,p2end); while(!done) { XSync(display,0); XNextEvent(display, &event); if(event.type == MotionNotify) { draw_cross(dpy,win,red_r_gc,x,y, width,height, event.xmotion.x, event.xmotion.y, cross_mode,DRAW_FLAG); fy=x1begb+(x1endb-x1begb)*(event.xmotion.y-y)/height; draw_seg(dpy,win,gc,pick_x,oldy); oldy=event.xmotion.y; draw_seg(dpy,win,gc,pick_x,oldy); xMouseLoc(dpy,win,event,style,True, x,y,width,height,x1begb,x1endb, x2begb,x2endb,p2beg,p2end); } if(event.type == ButtonRelease) { done=TRUE; } } } }}void draw_pick(Display *dpy, Window win, GC gc, pick_t *pick, int i, int xmargin, int ymargin, int width, int height, float x1begb, float x1endb, float x2begb, float x2endb, float p2beg, float p2end){ int x,y; float scale,base; scale = width/(x2endb+p2end-x2begb-p2beg); base = xmargin-scale*(x2begb+p2beg);/* x = base+scale*i-0.5; */ x = base+scale*(pick[i].x2)-0.5; y=ymargin+x1begb+(pick[i].time-x1begb)/(x1endb-x1begb)*height; printf("DRAW: %d %f %f \n",i,pick[i].x2,pick[i].time); draw_seg(dpy,win,gc,x,y);}void check_buttons(Display *dpy, Window win, GC gc,XEvent event,pick_t **apick, int num_wiggles, int x, int y, int winwidth, int height, float x1begb, float x1endb, float x2begb, float x2endb, float p2beg, float p2end, TextSet *filename_input, char *pick_fname, int *control_mode, int *edit_mode, int *cross_mode, int *pickdimax, int *pickdimend, int verbose, int x1x2){ int mx=event.xbutton.x; int my=event.xbutton.y; if(gc != gc) height += 0; x+= 0; y += 0; /* keep compiler happy */ x1begb += 0.0; x1endb += 0.0; /* keep compiler happy */ x2begb += 0.0; x2endb += 0.0; /* keep compiler happy */ p2beg += 0.0; p2end += 0.0; /* keep compiler happy */ if(mx>winwidth-COMMAND_WIDTH-10 && mx<winwidth-COMMAND_WIDTH+BUTTON_WIDTH-10) { if(my>BUTTON_HEIGHT*1-(char_height+10) && my<BUTTON_HEIGHT*1) { AddTextSetString(filename_input,""); filename_input->char_pos=0; RefreshTextSet(filename_input); } if(my>BUTTON_HEIGHT*2 && my<BUTTON_HEIGHT*3) { /*LOAD*/ NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*2, BUTTON_WIDTH,BUTTON_HEIGHT, DOWN,grey_color,black_color, "Load",char_width,char_height,RELATIVE); GetTextLineString(filename_input,0,pick_fname); if (verbose) warn("before load: 1: %lu 2: %lu", (unsigned long) *apick, (unsigned long) *apick+1); load_picks(apick,num_wiggles,pick_fname, pickdimax, pickdimend,verbose,x1x2); if (verbose) warn("after load: 1: %lu 2: %lu", (unsigned long) *apick, (unsigned long) *apick+1); /* force expose event */ XClearArea(dpy,win,0,0,0,0,True); NewButton(window,winwidth-COMMAND_WIDTH-10, BUTTON_HEIGHT*2, BUTTON_WIDTH,BUTTON_HEIGHT, UP,grey_color,black_color, "Load",char_width,char_height,RELATIVE); } if(my>BUTTON_HEIGHT*4 && my<BUTTON_HEIGHT*5) { /*save*/ NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*4, BUTTON_WIDTH,BUTTON_HEIGHT, DOWN,grey_color,black_color, "Save",char_width,char_height,RELATIVE); GetTextLineString(filename_input,0,pick_fname); if (verbose) warn("before save: 1: %lu 2: %lu", (unsigned long) *apick, (unsigned long) *apick+1); save_picks(apick,num_wiggles,pick_fname, pickdimax,pickdimend,verbose,x1x2); if (verbose) warn("after save: 1: %lu 2: %lu", (unsigned long) *apick,(unsigned long) *apick+1); NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*4, BUTTON_WIDTH,BUTTON_HEIGHT, UP,grey_color,black_color, "Save",char_width,char_height,RELATIVE); } if(my>BUTTON_HEIGHT*6 && my<BUTTON_HEIGHT*7) { /*control mode*/ *control_mode=!(*control_mode); if(*control_mode==PICK_MODE) { SetCurrentTextSet(filename_input,DOWN); } else { SetCurrentTextSet(filename_input,UP); } /* force expose event */ XClearArea(dpy,win,0,0,0,0,True); NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*6, BUTTON_WIDTH,BUTTON_HEIGHT, UP,grey_color,black_color, (*control_mode==PICK_MODE) ? "Pick" : "View only", char_width,char_height,RELATIVE); } if(my>BUTTON_HEIGHT*8 && my<BUTTON_HEIGHT*9) { /*edit mode*/ *edit_mode = !(*edit_mode); NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*8, BUTTON_WIDTH,BUTTON_HEIGHT, UP,grey_color,black_color, (*edit_mode==ADD_MODE) ? "Add" : "Delete", char_width,char_height,RELATIVE); } if(my>BUTTON_HEIGHT*10 && my<BUTTON_HEIGHT*11) { /*crosshair toggle*/ *cross_mode = !(*cross_mode); NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*10, BUTTON_WIDTH,BUTTON_HEIGHT, UP,grey_color,black_color, (*cross_mode) ? "Cross On" : "Cross Off", char_width,char_height,RELATIVE); } }}void draw_command_bar(int winwidth, TextSet *filename_input, char *pick_fname, int control_mode, int edit_mode, int cross_mode){ /* load button */ NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*2, BUTTON_WIDTH,BUTTON_HEIGHT, UP,grey_color,black_color, "Load",char_width,char_height,RELATIVE); /* save button */ NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*4, BUTTON_WIDTH,BUTTON_HEIGHT, UP,grey_color,black_color, "Save",char_width,char_height,RELATIVE); /* command-mode button */ NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*6, BUTTON_WIDTH,BUTTON_HEIGHT, UP,grey_color,black_color, (control_mode==PICK_MODE) ? "Pick" : "View Only", char_width,char_height,RELATIVE); /* edit-mode button */ NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*8, BUTTON_WIDTH,BUTTON_HEIGHT, UP,grey_color,black_color, (edit_mode==ADD_MODE) ? "Add" : "Delete", char_width,char_height,RELATIVE); /* cross-hair toggle */ NewButton(window,winwidth-COMMAND_WIDTH-10,BUTTON_HEIGHT*10, BUTTON_WIDTH,BUTTON_HEIGHT, UP,grey_color,black_color, (cross_mode) ? "Cross On" : "Cross Off", char_width,char_height,RELATIVE); AddTextSetString(filename_input,pick_fname); if(control_mode==PICK_MODE) SetCurrentTextSet(filename_input,DOWN); else SetCurrentTextSet(filename_input,UP); RefreshTextSet(filename_input); /* make sure fg,bg are what xpicker expects */ /* garnish may have mauled them */ XSetForeground(display,gc,BlackPixel(display,screen)); XSetBackground(display,gc,WhitePixel(display,screen));}void draw_seg(Display *dpy, Window win, GC gc, int x, int y){ XDrawLine(dpy,win,gc,x-10,y+5,x,y); XDrawLine(dpy,win,gc,x-10,y-5,x,y);}float *read_keyval(char *x2file,int *ioff,int verbose){ char line[80]; float off_tmp; float *off; /* pointer for 1-d float array */ int keyvalnum; FILE *infpoff;/* Read in header values (allowable pick.x2 values and also allowable values (for these traces) in pick file */ keyvalnum = 10; infpoff = fopen(x2file,"r"); off = (float *) malloc(keyvalnum*sizeof(float )); if (infpoff == 0 ) { *ioff = -99; } else { *ioff = -1; while ( fgets(line,81,infpoff) != 0 && line[0] != '\n' ) { ++*ioff; if ( *ioff >= (keyvalnum - 2 ) ) { keyvalnum = 2 * keyvalnum; off = (float *) realloc(off,keyvalnum*sizeof(float )); } sscanf(line,"%f",&off_tmp); *(off + *ioff) = off_tmp; if (verbose) warn("x-axis value %d %f",*ioff,off[*ioff]); } } return(off);}void realloc_picks(pick_t **apick, int more, int *pickdimax, int *pickdimend, int verbose){ int i; /* loop counter *//* dynamically reallocate memory for picks - Bill Lutter */ if ( (more + *pickdimend) >= *pickdimax - 2 ) { *pickdimax = 2*( *pickdimax + more ); if (verbose) warn("before realloc: 1: %lu 2: %lu", (unsigned long) *apick, (unsigned long) *apick+1); *apick = (pick_t *) realloc(*apick,*pickdimax*sizeof(struct pick_tag )); if (verbose) warn("after realloc: 1: %lu 2: %lu\n", (unsigned long) *apick, (unsigned long) *apick+1); if(*apick==NULL) err("Could not allocate picks!"); for(i= *pickdimend;i< *pickdimax;i++) { (*apick)[i].picked=FALSE; } }}void init_picks(pick_t **apick, int *pickdimax, int *pickdimend){int i = pickdimend[0]/*dummy*/;/* dynamically allocate memory for picks - Bill Lutter */ if(*apick==NULL) err("Could not allocate picks!"); for(i=0;i<*pickdimax;i++) { (*apick)[i].picked=FALSE; }}void add_pick(pick_t **apick, int *pickdimax, int *pickdimend, float *off, int ioff, float fy, int *pick_num, int *ihead, int verbose){ int i, more=1; float dxval, dxmin=100000.;/* dynamically reallocate memory for picks - Bill Lutter */ realloc_picks(apick, more, pickdimax, pickdimend, verbose); /* existence of x2file= file with x-axis header values is indicated by positive values of "ioff". If file does not exist then ioff is negative. Then use mouse derived x-axis value for pick. */ if (ioff >= 0 ) { for (i=0;i <= ioff; i++) { dxval = abs(off[i] - *pick_num); if ( dxval <= dxmin) { *ihead = i; dxmin = dxval; } } *pick_num = off[*ihead]; } (*apick)[*pickdimend].x2 = *pick_num; (*apick)[*pickdimend].time = fy; (*apick)[*pickdimend].picked=TRUE; printf("ADD (x,t): (%d, %f) pick(i,x,t): (%d, %f, %f)\n", *pick_num, fy,*pickdimend,(*apick)[*pickdimend].x2,(*apick)[*pickdimend].time); ++*pickdimend;}void del_pick(pick_t **apick, int *pickdimax, int *pickdimend, float *off, int ioff, float fy, int *pick_num, int *ihead, int verbose){int i = pickdimax[0]/*dummy*/;float dxmin=100000., dxval,dtval; if (ioff >= 0 ) { for (i=0;i <= ioff; i++) { dxval = abs(off[i] - *pick_num); if ( dxval <= dxmin) { *ihead = i; dxmin = dxval; } } if (*ihead >=0 ) *pick_num = off[*ihead]; }/* search for pick to delete */ dxmin = 10000000.; *ihead = -1; for (i=0;i < *pickdimend; i++) { dxval = (*apick)[i].x2 - *pick_num; dxval = dxval * dxval; dtval = fy - (*apick)[i].time; dtval = dtval * dtval; dxval = dxval + dtval; if ( dxval <= dxmin) { *ihead = i; dxmin = dxval; } } if (verbose) warn("DEL (x,t): (%d, %f) pick(i,x,t): (%d, %f, %f)", *pick_num, fy,*ihead,(*apick)[*ihead].x2,(*apick)[*ihead].time);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -