📄 ui_canvas.c
字号:
/*User_interface: canvas controls*/#include <Xm/MainW.h>#include <stdio.h>#include "main.h"#include "ui.h"#include "axis.h"#include "data.h"#include "map.h"#include "render.h"#include "view.h"#include "region.h"#include "pick.h"#include "movie.h"#include "color.h"#include "colorbar.h"extern UI ui;extern Message message;/* canvas mouse callbacks */char canvas_trans[] = "#replace\n\ <Key>h,<Btn1Motion>: UIZoomDrag()\n\ <Key>h,<Btn1Down>: UIHZoomStart()\n\ <Key>v,<Btn1Motion>: UIZoomDrag()\n\ <Key>v,<Btn1Down>: UIVZoomStart()\n\ <Btn1Down>: UIZoomStart()\n\ <Btn1Motion>: UIZoomDrag()\n\ <Btn1Up>: UIZoomEnd()\n\ <Btn2Down>: UIFrameStart()\n\ <Btn2Motion>: UIFrameDrag()\n\ <Btn2Up>: UIFrameEnd()\n\ <Key>a,<Btn3Down>: UIPikAdd()\n\ <Key>m,<Btn3Down>: UIPikMove()\n\ <Key>d,<Btn3Down>: UIPikDelete()\n\ <Key>q,<Btn3Down>: UIPikQuery()\n\ <Key>?,<Btn3Down>: UIPikQuery()\n\ <Key>u,<Btn3Down>: PikUndo()\n\ <Key>s,<Btn3Motion>: UISubvolumeDrag()\n\ <Key>s,<Btn3Down>: UISubvolumeStart()\n\ <Key>s,<Btn3Up>: UISubvolumeEnd()\n\ <Btn3Down>: UIPick()";char colorbar_trans[] = "#replace\n\ <BtnDown>: UIColorbarStart()\n\ <BtnMotion>: UIColorbarDrag()\n\ <BtnUp>: UIColorbarEnd()";extern UIZoomStart();extern UIHZoomStart();extern UIVZoomStart();extern UIDraw();extern UIZoomDrag();extern UIZoomEnd();extern UIFrameStart();extern UIFrameDrag();extern UIFrameEnd();extern UISubvolumeStart();extern UISubvolumeDrag();extern UISubvolumeEnd();extern UIPick();extern UIPikAdd();extern UIPikMove();extern UIPikDelete();extern UIPikQuery();extern PikUndo();extern UIColorbarStart();extern UIColorbarDrag();extern UIColorbarEnd();XtActionsRec ui_actions[] = { {"UIZoomStart", (XtActionProc)UIZoomStart}, {"UIHZoomStart", (XtActionProc)UIHZoomStart}, {"UIVZoomStart", (XtActionProc)UIVZoomStart}, {"UIZoomDrag", (XtActionProc)UIZoomDrag}, {"UIZoomEnd", (XtActionProc)UIZoomEnd}, {"UIFrameStart", (XtActionProc)UIFrameStart}, {"UIFrameDrag", (XtActionProc)UIFrameDrag}, {"UIFrameEnd", (XtActionProc)UIFrameEnd}, {"UISubvolumeStart", (XtActionProc)UISubvolumeStart}, {"UISubvolumeDrag", (XtActionProc)UISubvolumeDrag}, {"UISubvolumeEnd", (XtActionProc)UISubvolumeEnd}, {"UIPick", (XtActionProc)UIPick}, {"UIPikAdd", (XtActionProc)UIPikAdd}, {"UIPikMove", (XtActionProc)UIPikMove}, {"UIPikDelete", (XtActionProc)UIPikDelete}, {"UIPikQuery", (XtActionProc)UIPikQuery}, {"PikUndo", (XtActionProc)PikUndo}, {"UIColorbarStart", (XtActionProc)UIColorbarStart}, {"UIColorbarDrag", (XtActionProc)UIColorbarDrag}, {"UIColorbarEnd", (XtActionProc)UIColorbarEnd},};int ui_nactions = sizeof (ui_actions) / sizeof (ui_actions[0]);/* return canvas size */UICanvasSize (wide,hite)int *wide, *hite; { if (!ui) return; *wide = 0; *hite = 0; XtVaGetValues (ui->canvas,XmNwidth,wide,XmNheight,hite,NULL); *wide /= 65536; *hite /= 65536; }/* return color bar size */UIColorbarSize (wide,hite)int *wide, *hite; { if (!ui) return; *wide = 0; *hite = 0; XtVaGetValues (ui->colorbar,XmNwidth,wide,XmNheight,hite,NULL); *wide /= 65536; *hite /= 65536; }/* callbacks: call one or routines of other objects with arguments fetch state from widget set state of user interface to be conistentif a callback does not fetch or set state and is only one routine, the it is called directly from other objects*//* draw color bar after exposure or resize callback */UIDrawColorbar (widget)Widget widget; { int wide, hite; if (!ui) return; if (ui->first) { if (ui->first == 1) { MainFirst(); ui->first = 2; } else if (ui->first == 2) { ui->first = 0; } } ColorbarDraw (); }/* draw canvas after exposure or resize callback */UIDrawCanvas (widget)Widget widget; { int wide, hite; if (!ui) return; if (ui->first) { if (ui->first == 1) { MainFirst(); ui->first = 2; } else if (ui->first == 2) { ui->first = 0; } } ViewSize0(); ViewDrawAll(); }/* start zoom window callback */UIZoomStart (widget,event)Widget widget;XButtonEvent *event; { if (!ui) return; ui->hzoom = 1; ui->vzoom = 1; ui->x1 = event->x; ui->y1 = event->y; }UIHZoomStart (widget,event)Widget widget;XButtonEvent *event; { if (!ui) return; ui->hzoom = 1; ui->x1 = event->x; ui->y1 = event->y; }UIVZoomStart (widget,event)Widget widget;XButtonEvent *event; { if (!ui) return; ui->vzoom = 1; ui->x1 = event->x; ui->y1 = event->y; }/* colorbar pick start callback */UIColorbarStart (widget,event)Widget widget;XButtonEvent *event; { if (!ui) return; DrawWindow (UIColorbarWindow()); ui->x1 = event->x; ui->y1 = event->y; UIColorbarDrag (widget,event); }/* zoom window drag callback */UIZoomDrag (widget,event)Widget widget;XButtonEvent *event; { if (!ui) return; DrawBox (ui->x1,ui->y1,ui->x2,ui->y2,ERASE); DrawBox (ui->x1,ui->y1,ui->x2=event->x,ui->y2=event->y,DRAW); }/* colorbar pick drag callback */UIColorbarDrag (widget,event)Widget widget;XButtonEvent *event; { extern View view; if (!ui) return; ColorbarSetMark (MapMap(ViewMap(view,AXIS_COLOR),event->x), MapMap(ViewMap(view,AXIS_COLOR),event->x),TOP_MARK); }/* smooth drag callback */UISubvolumeDrag (widget,event)Widget widget;XButtonEvent *event; { PickPoint_ pick; if (!ui) return; if ((ui->x1-event->x)*(ui->x1-event->x)+(ui->y1-event->y)*(ui->y1-event->y)<25) return; DrawArrow (ui->x1,ui->y1,ui->x2,ui->y2,10,ERASE); DrawArrow (ui->x1,ui->y1,ui->x2=event->x,ui->y2=event->y,10,DRAW); PickDecode (event->x,event->y,&pick,1); ui->v2 = pick.index[DATA_VALUE]; ColorbarSetMark (ui->v1,ui->v2,BOTTOM_MARK); }/* frame drag callback */UIFrameDrag (widget,event)Widget widget;XButtonEvent *event; { PickPoint_ pick; DrawLine (ui->x1,ui->y1,ui->x2,ui->y2,ERASE); DrawLine (ui->x1,ui->y1,ui->x2=event->x,ui->y2=event->y,DRAW); PickDecode (event->x,event->y,&pick,1); }/* zoom window end callback */UIZoomEnd (widget,event)Widget widget;XButtonEvent *event; { DrawBox (ui->x1,ui->y1,ui->x2,ui->y2,ERASE); ViewWindow (ui->x1,ui->y1,ui->x2=event->x,ui->y2=event->y,ui->hzoom,ui->vzoom); ui->hzoom = 0; ui->vzoom = 0; ui->x1 = NO_INDEX; ui->y1 = NO_INDEX; ui->x2 = NO_INDEX; ui->y2 = NO_INDEX; UISizeReset (); }/* colorbar pick end callback */UIColorbarEnd (widget,event)Widget widget;XButtonEvent *event; { extern View view; extern Data data; ColorbarSetMark (MapMap(ViewMap(view,AXIS_COLOR),event->x), MapMap(ViewMap(view,AXIS_COLOR),event->x),TOP_MARK); DrawWatch (1); RegionSetValue (MapMap(ViewMap(view,AXIS_COLOR),event->x),RegionBound(1)); DrawWatch (0); ViewDrawAll (); ColorbarSetMark (NO_INDEX,NO_INDEX,TOP_MARK); ColorbarSetMark (NO_INDEX,NO_INDEX,BOTTOM_MARK); ui->x1 = NO_INDEX; ui->y1 = NO_INDEX; ui->x2 = NO_INDEX; ui->y2 = NO_INDEX; DrawWindow (UICanvasWindow()); }/* smooth end callback */UISubvolumeEnd (widget,event)Widget widget;XButtonEvent *event; { PickPoint_ pick1, pick2; if (!ui) return; DrawArrow (ui->x1,ui->y1,ui->x2,ui->y2,10,ERASE); PickDecode (ui->x1,ui->y1,&pick1,1); PickDecode (ui->x2,ui->y2,&pick2,1); if (!PickSameFrame (&pick1,&pick2)) return; RegionSetBound (ui->v1,0); RegionSetBound (ui->v2,1); DrawWatch (1); RegionMark0 (); DrawWatch (0); ui->x1 = NO_INDEX; ui->y1 = NO_INDEX; ui->x2 = NO_INDEX; ui->y2 = NO_INDEX; }/* report pick point values */UIPick (widget,event)Widget widget;XButtonEvent *event; { PickPoint_ pick; PickDecode (event->x,event->y,&pick,1); }/* movie callback */UIFrameStart (widget,event)Widget widget;XButtonEvent *event; { if (!ui) return; ui->x1 = event->x; ui->y1 = event->y; }UIFrameEnd (widget,event)Widget widget;XButtonEvent *event; { extern View view; PickPoint_ pick1, pick2; int iaxis, iaxis1, sep[VIEW_NAXIS]; if (!ui) return; PickDecode (ui->x1,ui->y1,&pick1,1); DrawLine (ui->x1,ui->y1,ui->x2,ui->y2,ERASE); ui->x2 = event->x; ui->y2 = event->y; PickDecode (ui->x2,ui->y2,&pick2,1); for (iaxis=AXIS_DOWN; iaxis<=AXIS_DEEP; iaxis++) { iaxis1 = AxisDir(MapAxis(ViewMap(view,iaxis))); sep[iaxis1] = pick1.index[iaxis1] - MapFrame(ViewMap(view,iaxis)); sep[iaxis1] *= sep[iaxis1]; } if ((ui->x1-ui->x2)*(ui->x1-ui->x2)+(ui->y1-ui->y2)*(ui->y1-ui->y2) < 10) { ViewSetFrames (event->x,event->y); } else switch (pick1.iaxis[AXIS_DEEP]) { case AXIS_DEEP: if ((ui->x1-ui->x2)*(ui->x1-ui->x2)>(ui->y1-ui->y2)*(ui->y1-ui->y2)) { MapSetFrameBounds (ViewMap(view,AXIS_ACROSS),pick1.index[AXIS_ACROSS],pick2.index[AXIS_ACROSS]); ViewSetMovie (AXIS_ACROSS); MovieOn (); } else { MapSetFrameBounds (ViewMap(view,AXIS_DOWN),pick1.index[AXIS_DOWN],pick2.index[AXIS_DOWN]); ViewSetMovie (AXIS_DOWN); MovieOn (); } break; case AXIS_ACROSS: if ((ui->x1-ui->x2)*(ui->x1-ui->x2)>(ui->y1-ui->y2)*(ui->y1-ui->y2)) { MapSetFrameBounds (ViewMap(view,AXIS_DEEP),pick1.index[AXIS_DEEP],pick2.index[AXIS_DEEP]); ViewSetMovie (AXIS_DEEP); MovieOn (); } else { MapSetFrameBounds (ViewMap(view,AXIS_DOWN),pick1.index[AXIS_DOWN],pick2.index[AXIS_DOWN]); ViewSetMovie (AXIS_DOWN); MovieOn (); } break; case AXIS_DOWN: if ((ui->x1-ui->x2)*(ui->x1-ui->x2)>(ui->y1-ui->y2)*(ui->y1-ui->y2)) { MapSetFrameBounds (ViewMap(view,AXIS_ACROSS),pick1.index[AXIS_ACROSS],pick2.index[AXIS_ACROSS]); ViewSetMovie (AXIS_ACROSS); MovieOn (); } else { MapSetFrameBounds (ViewMap(view,AXIS_DEEP),pick1.index[AXIS_DEEP],pick2.index[AXIS_DEEP]); ViewSetMovie (AXIS_DEEP); MovieOn (); } break; } ui->x1 = NO_INDEX; ui->y1 = NO_INDEX; ui->x2 = NO_INDEX; ui->y2 = NO_INDEX; }/* add point point callback */UIPikAdd (widget,event)Widget widget;XButtonEvent *event; { PikAdd (event->x,event->y); }/* insert a pick into the pick line */UIPickInsert (widget,event)Widget widget;XButtonEvent *event; { PickInsert (event->x,event->y); }/* start region picking */UISubvolumeStart (widget,event)Widget widget;XButtonEvent *event; { PickPoint_ pick; if (!ui) return; ui->x1 = event->x; ui->y1 = event->y; PickDecode (event->x,event->y,&pick,1); RegionSetSeed (pick.index); ui->v1 = pick.index[DATA_VALUE]; }/* replace pick point callback */UIPikMove (widget,event)Widget widget;XButtonEvent *event; { PikMove (event->x,event->y); }/* delete pick point callback */UIPikDelete (widget,event)Widget widget;XButtonEvent *event; { PikDelete (event->x,event->y); }/* query pik point callback */UIPikQuery (widget,event)Widget widget;XButtonEvent *event; { PikQuery (event->x,event->y); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -