📄 dataview.cpp
字号:
x_mouse_move = x; y_mouse_move = y; }template <class DATA>void DataView<DATA>::mouse_click ( int button, int state, int x, int y ) { mouse_button = button; MenuCoord CDM(x-xDispMenu,y-yDispMenu); MenuCoord CAM(x-xAppMenu,y-yAppMenu); if (state == DISPLAY_UP_BUTTON) { if ( (x==x_mouse_click_down) && (y==y_mouse_click_down) ) { if (button == DISPLAY_LEFT_BUTTON) { if ( (displayDispMenu) && (dispMenu.m_bbox.encloses(CDM)) ) { int b = dispMenu.evaluate_click(x-xDispMenu,y-yDispMenu); if (b!=-1) { evaluate_display_menu_click(b); display_again(); } } if ( (displayAppMenu) && (appMenu.m_bbox.encloses(CAM)) ) { int b = appMenu.evaluate_click(x-xAppMenu,y-yAppMenu); if (b!=-1) { if (appButtonHandler!=NULL) appButtonHandler(b); display_again(); } } if ( (!displayAppMenu) && ( (!displayDispMenu) || (!dispMenu.m_bbox.encloses(CDM)) ) ) { displayAppMenu = true; xAppMenu = x; yAppMenu = y; display_again(); } } else if (button == DISPLAY_RIGHT_BUTTON) { if ( (displayAppMenu) && (appMenu.m_bbox.encloses(CAM)) ) { displayAppMenu = false; display_again(); } else if (!displayDispMenu) { displayDispMenu = true; xDispMenu = x; yDispMenu = y; display_again(); } else if (dispMenu.m_bbox.encloses(CDM)) { displayDispMenu = false; display_again(); } } } } else if (state == DISPLAY_DOWN_BUTTON) { x_mouse_click_down = x; y_mouse_click_down = y; x_mouse_move = x; y_mouse_move = y; } }template <class DATA>void DataView<DATA>::display ( ) { if (perspectiveView) display_mode_3d ( focus_coord(DATAVIEW_AXIS_X), focus_coord(DATAVIEW_AXIS_Y), focus_coord(DATAVIEW_AXIS_Z), view_coord(DATAVIEW_AXIS_DISTANCE), view_coord(DATAVIEW_AXIS_TWIST), view_coord(DATAVIEW_AXIS_ELEVATION), view_coord(DATAVIEW_AXIS_AZIMUTH) ); else display_mode_2d ( focus_coord(DATAVIEW_AXIS_X), focus_coord(DATAVIEW_AXIS_Y), focus_coord(DATAVIEW_AXIS_Z), view_coord(DATAVIEW_AXIS_DISTANCE) ); if (statisticsView) { DispCoord X; display_color(COLOR_WHITE); X = focus_coord; X(DATAVIEW_AXIS_X)-=0.5; display_line_intern(focus_coord,X,0.0); X(DATAVIEW_AXIS_X)+=0.5; X(DATAVIEW_AXIS_Y)-=0.5; display_line_intern(focus_coord,X,0.0); X(DATAVIEW_AXIS_Y)+=0.5; X(DATAVIEW_AXIS_Z)-=0.5; display_line_intern(focus_coord,X,0.0); display_color(COLOR_RED); X(DATAVIEW_AXIS_Z)+=0.5; X(DATAVIEW_AXIS_X)+=1.0; display_line_intern(focus_coord,X,0.0); display_color(COLOR_GREEN); X(DATAVIEW_AXIS_X)-=1.0; X(DATAVIEW_AXIS_Y)+=1.0; display_line_intern(focus_coord,X,0.0); display_color(COLOR_BLUE); X(DATAVIEW_AXIS_Y)-=1.0; X(DATAVIEW_AXIS_Z)+=1.0; display_line_intern(focus_coord,X,0.0); } display_scale(scalefac(0),scalefac(1),scalefac(2)); if (appDisplayFunc!=NULL) appDisplayFunc(); if (statisticsView) { DispCoord X,Y; display_color(COLOR_RED); display_point_intern(red_coord,0.5); display_color(COLOR_GREEN); display_point_intern(green_coord,0.5); display_color(COLOR_BLUE); display_point_intern(blue_coord,0.5); display_color(COLOR_DARKGRAY); boundBox.include(red_coord); boundBox.include(blue_coord); boundBox.include(green_coord); X = boundBox.lowerBound; Y = boundBox.upperBound; display_cube(X(0),X(1),X(2),Y(0),Y(1),Y(2)); } // display menus if (displayDispMenu) { dispMenu.display(xDispMenu,yDispMenu); } if (displayAppMenu) { appMenu.display(xAppMenu,yAppMenu); } if (statisticsView) { statistics(); } }template <class DATA>void DataView<DATA>::set_focus ( const DATA& a_focus ) { convert_coord(a_focus,focus_coord); for (int i=0;i<4;++i) focus_coord[i]*=scalefac[i]; }template <class DATA>void DataView<DATA>::set_red ( const DATA& a_red ) { convert_coord(a_red,red_coord); for (int i=0;i<4;++i) red_coord[i]*=scalefac[i]; }template <class DATA>void DataView<DATA>::set_green ( const DATA& a_green ) { convert_coord(a_green,green_coord); for (int i=0;i<4;++i) green_coord[i]*=scalefac[i]; }template <class DATA>void DataView<DATA>::set_blue ( const DATA& a_blue ) { convert_coord(a_blue,blue_coord); for (int i=0;i<4;++i) blue_coord[i]*=scalefac[i]; }template <class DATA>void DataView<DATA>::reset_bbox ( ) { boundBox.reset(); }template <class DATA>void DataView<DATA>::evaluate_display_menu_click(int b) { int i,row,column; if ((b>=DATAVIEW_BUTTON_MOMO) && (b<DATAVIEW_BUTTON_MOMO+80)) { column = (b-DATAVIEW_BUTTON_MOMO)/10; row = (b-DATAVIEW_BUTTON_MOMO)-column*10; if (column < 4) { if (dispMenu.m_buttons[b].state == ButtonOn) rotate[row]=column; else rotate[row]=-1; for (i=0;i<4;++i) if (i!=column) { dispMenu.m_buttons[100+row+10*i].state = ButtonOff; } } else // column >= 4 { if (dispMenu.m_buttons[b].state == ButtonOn) cartesian[row]=column-4; else cartesian[row]=-1; for (i=4;i<8;++i) if (i!=column) { dispMenu.m_buttons[100+row+10*i].state = ButtonOff; } } } else if ((b>=200) && (b<280)) { column = (b-200)/10; row = (b-200)-column*10; if (column<4) { // axis grid for (i=0;i<data_size;++i) { if (i!=row) dispMenu.m_buttons[200+column*10+i].state = ButtonOff; } if (dispMenu.m_buttons[b].state==ButtonOff) axis[column]=-1; else axis[column] = row; } else if ((column==5) || (column==7)) { // scaling section float factor = (column==5) ? 1.1 : 1.0/1.1; scalefac(row) *= factor; scaletext[row][0]=scaletext[row][DISPLAY_SCALE_OUTPUT_LENGTH]='\0'; ostrstream output(scaletext[row],DISPLAY_SCALE_OUTPUT_LENGTH,ios::trunc); output << scalefac(row) << '\0'; dispMenu.m_buttons[b].state=ButtonOff; } } else if ( (b>=DATAVIEW_BUTTON_CONTROL_BASE) && (b<DATAVIEW_BUTTON_CONTROL_BASE+DATAVIEW_CONTROL_MODES) ) { for (i=DATAVIEW_BUTTON_CONTROL_BASE; i<DATAVIEW_BUTTON_CONTROL_BASE+DATAVIEW_CONTROL_MODES; ++i ) { if (i!=b) dispMenu.m_buttons[i].state = ButtonOff; } dispMenu.m_buttons[b].state = ButtonOn; controlMode = b-DATAVIEW_BUTTON_CONTROL_BASE; switch (controlMode) { case DATAVIEW_CONTROL_EYE: break; case DATAVIEW_CONTROL_FOCUS: cart_coord = &focus_coord; break; case DATAVIEW_CONTROL_RED: cart_coord = &red_coord; break; case DATAVIEW_CONTROL_BLUE: cart_coord = &blue_coord; break; case DATAVIEW_CONTROL_GREEN: cart_coord = &green_coord; break; default: error("unexpected control mode",SOURCELOC); } } else switch (b) { case 995 : case 996 : // 2d/3d ortho/perspective if (perspectiveView) { perspectiveView = false; dispMenu.m_buttons[995].state=ButtonOn; // 2d dispMenu.m_buttons[996].state=ButtonOff; // 3d } else { perspectiveView = true; dispMenu.m_buttons[995].state=ButtonOff; // 2d dispMenu.m_buttons[996].state=ButtonOn; // 3d } break; case 997 : // reset view_coord(DATAVIEW_AXIS_DISTANCE) = 5.0; view_coord(DATAVIEW_AXIS_ELEVATION) = 0.0; view_coord(DATAVIEW_AXIS_TWIST) = 0.0; view_coord(DATAVIEW_AXIS_AZIMUTH) = 0.0; focus_coord(DATAVIEW_AXIS_X) = 0.0; focus_coord(DATAVIEW_AXIS_Y) = 0.0; focus_coord(DATAVIEW_AXIS_Z) = 0.0; focus_coord(DATAVIEW_AXIS_T) = 0.0; for (row=0;row<4;++row) { scalefac(row)=1.0; scaletext[row][0]=scaletext[row][DISPLAY_SCALE_OUTPUT_LENGTH]='\0'; ostrstream output(scaletext[row],DISPLAY_SCALE_OUTPUT_LENGTH,ios::trunc); output << scalefac(row) << '\0'; } dispMenu.m_buttons[997].state=ButtonOff; // reset break; case DATAVIEW_BUTTON_BOUNDING_BOX : estimateBoundBox = (dispMenu.m_buttons[b].state==ButtonOn); boundBox.reset(); break; case DATAVIEW_BUTTON_SCALE_BB_4AXES : // bounding box is a box with edge length of 10.0 for (row=0;row<4;++row) { TRange length( equal(boundBox.length(row),0) ? 1.0 : boundBox.length(row) ); scalefac(row) = 10.0/length; scaletext[row][0]=scaletext[row][DISPLAY_SCALE_OUTPUT_LENGTH]='\0'; ostrstream output(scaletext[row],DISPLAY_SCALE_OUTPUT_LENGTH,ios::trunc); output << scalefac(row) << '\0'; focus_coord(row) = 10.0*boundBox.mean(row)/length; } dispMenu.m_buttons[b].state = ButtonOff; break; case DATAVIEW_BUTTON_SCALE_BB_PROP : // bounding box is a box with edge length of 10.0 { TRange length(0); for (row=0;row<4;++row) { if (length<boundBox.length(row)) length=boundBox.length(row); } if (equal(length,0)) length=1; for (row=0;row<4;++row) { scalefac(row) = 10.0/length; scaletext[row][0]=scaletext[row][DISPLAY_SCALE_OUTPUT_LENGTH]='\0'; ostrstream output(scaletext[row],DISPLAY_SCALE_OUTPUT_LENGTH,ios::trunc); output << scalefac(row) << '\0'; focus_coord(row) = 10.0*boundBox.mean(row)/length; } dispMenu.m_buttons[b].state = ButtonOff; } break; case DATAVIEW_BUTTON_CENTER_FOCUS : dispMenu.m_buttons[b].state = ButtonOff; for (row=0;row<4;++row) { focus_coord(row) = boundBox.mean(row)*scalefac(row); } break; case DATAVIEW_BUTTON_DISPLAY_STATISTICS : statisticsView = (dispMenu.m_buttons[b].state==ButtonOn); break; case DATAVIEW_BUTTON_EXIT : if (appExitHandler!=NULL) appExitHandler(); exit(0); break; case DATAVIEW_BUTTON_SCALEFAC1 : case DATAVIEW_BUTTON_SCALEFAC2 : case DATAVIEW_BUTTON_SCALEFAC3 : case DATAVIEW_BUTTON_SCALEFAC4 : case DATAVIEW_BUTTON_SCALEFAC5 : dispMenu.m_buttons[DATAVIEW_BUTTON_SCALEFAC + sensitivityGrade].state = ButtonOff; sensitivityGrade = b - DATAVIEW_BUTTON_SCALEFAC; dispMenu.m_buttons[DATAVIEW_BUTTON_SCALEFAC + sensitivityGrade].state = ButtonOn; sensitivity = sensitivityMap[sensitivityGrade]; break; } }template <class DATA>void DataView<DATA>::display(int w,int h, char* name) { int n0,x0,y0,i,j; ButtonState s; x0=0; y0=0; n0=DATAVIEW_BUTTON_MOMO; s=ButtonPassive; dispMenu.add( Button(x0 , y0+ 0, 50, 20, "MOMO", s, n0+80) ); dispMenu.add( Button(x0+ 50+ 0, y0+ 0, 20, 20, "a", s, n0+81) ); dispMenu.add( Button(x0+ 50+20, y0+ 0, 20, 20, "e", s, n0+82) ); dispMenu.add( Button(x0+ 50+40, y0+ 0, 20, 20, "t", s, n0+83) ); dispMenu.add( Button(x0+ 50+60, y0+ 0, 20, 20, "d", s, n0+84) ); dispMenu.add( Button(x0+135+ 0, y0+ 0, 20, 20, "x", s, n0+85) ); dispMenu.add( Button(x0+135+20, y0+ 0, 20, 20, "y", s, n0+86) ); dispMenu.add( Button(x0+135+40, y0+ 0, 20, 20, "z", s, n0+87) ); dispMenu.add( Button(x0+135+60, y0+ 0, 20, 20, "t", s, n0+88) ); dispMenu.add( Button(x0 , y0+20, 45, 20, "h+lb", s, n0+89) ); dispMenu.add( Button(x0 , y0+40, 45, 20, "v+lb", s, n0+90) ); dispMenu.add( Button(x0 , y0+60, 45, 20, "h+rb", s, n0+91) ); dispMenu.add( Button(x0 , y0+80, 45, 20, "v+rb", s, n0+92) ); /* Button ID's MoMo az el tw d x y z t h+lb 0 10 20 30 40 50 60 70 v+lb 1 11 21 31 41 51 61 71 h+rb 2 12 22 32 42 52 62 72 v+rb 3 13 23 33 43 53 63 73 */ for (i=0;i<4;++i) for (j=0;j<4;++j) { if (rotate[i]==j) s = ButtonOn; else s = ButtonOff; dispMenu.add( Button(x0+46+i*20,y0+20+j*20,20,20,"",s,n0+i*10+j) ); if (cartesian[i]==j) s = ButtonOn; else s = ButtonOff; dispMenu.add( Button(x0+135+i*20,y0+20+j*20,20,20,"",s,n0+(i+4)*10+j) ); } /* Button ID's DiAx x y z t - scale + 0 0 10 20 30 1 1 11 21 31 2 2 12 22 32 ... 7 (max) */ x0=0; y0=100; n0=200; for (i=0;i<data_size;++i) { dispMenu.add( Button(x0,y0+20+i*20,20,20,"x", ButtonPassive, n0+80+i) ); for (j=0;j<4;++j) { s = (axis[j]==i) ? ButtonOn : ButtonOff; dispMenu.add( Button(x0+46+j*20,y0+20+i*20,20,20,"",s,n0+j*10+i) ); } dispMenu.add( Button(x0+135,y0+20+i*20,15,20,"+", ButtonOff, n0+50+i) ); dispMenu.add( Button(x0+150,y0+20+i*20,50,20,scaletext[i], ButtonPassive, n0+60+i) ); dispMenu.add( Button(x0+200,y0+20+i*20,15,20,"-", ButtonOff, n0+70+i) ); } dispMenu.add( Button(x0 , y0+ 0, 50, 20, "DIAX", ButtonPassive, n0+90) ); dispMenu.add( Button(x0+ 50, y0+ 0, 20, 20, "x", ButtonPassive, n0+91) ); dispMenu.add( Button(x0+ 70, y0+ 0, 20, 20, "y", ButtonPassive, n0+92) ); dispMenu.add( Button(x0+ 90, y0+ 0, 20, 20, "z", ButtonPassive, n0+93) ); dispMenu.add( Button(x0+110, y0+ 0, 20, 20, "t", ButtonPassive, n0+94) ); x0=220; y0=0; n0=DATAVIEW_BUTTON_CONTROL_BASE; dispMenu.add( Button(x0 ,y0+20,75,20," eye",ButtonOn,n0+DATAVIEW_CONTROL_EYE) ); dispMenu.add( Button(x0 ,y0+40,75,20," focus",ButtonOff,n0+DATAVIEW_CONTROL_FOCUS) ); dispMenu.add( Button(x0 ,y0+60,25,20,"RL",ButtonOff,n0+DATAVIEW_CONTROL_RED) ); dispMenu.add( Button(x0+25,y0+60,25,20,"GL",ButtonOff,n0+DATAVIEW_CONTROL_GREEN) ); dispMenu.add( Button(x0+50,y0+60,25,20,"BL",ButtonOff,n0+DATAVIEW_CONTROL_BLUE) ); // ortho/perspective view x0=220; y0=100; n0=1000; dispMenu.add( Button(x0 ,y0 ,15, 20, "1",ButtonOff,DATAVIEW_BUTTON_SCALEFAC1) ); dispMenu.add( Button(x0+15,y0 ,15, 20, "2",ButtonOff,DATAVIEW_BUTTON_SCALEFAC2) ); dispMenu.add( Button(x0+30,y0 ,15, 20, "3",ButtonOn ,DATAVIEW_BUTTON_SCALEFAC3) ); dispMenu.add( Button(x0+45,y0 ,15, 20, "4",ButtonOff,DATAVIEW_BUTTON_SCALEFAC4) ); dispMenu.add( Button(x0+60,y0 ,15, 20, "5",ButtonOff,DATAVIEW_BUTTON_SCALEFAC5) ); n0=995; // [2D] [3D] [RE] 2D-view/3D-view/reset-view dispMenu.add( Button(x0 ,y0+20,25, 20, "2D",ButtonOff,n0) ); dispMenu.add( Button(x0+25,y0+20,25, 20, "3D",ButtonOn, n0+1) ); dispMenu.add( Button(x0+50,y0+20,25, 20, "RE",ButtonOff, n0+2) ); // [MK] [BX] [CF] marker on.off/calc bounding box on.off/center focus dispMenu.add( Button(x0 ,y0+40,25, 20, "MK",ButtonOn,DATAVIEW_BUTTON_DISPLAY_STATISTICS) ); dispMenu.add( Button(x0+25,y0+40,25, 20, "BX",ButtonOn,DATAVIEW_BUTTON_BOUNDING_BOX) ); dispMenu.add( Button(x0+50,y0+40,25, 20, "CF",ButtonOff,DATAVIEW_BUTTON_CENTER_FOCUS) ); // [S4] [SP] scale scene and center focus/ scale proportional dispMenu.add( Button(x0 ,y0+60,25,20,"S4",ButtonOff,DATAVIEW_BUTTON_SCALE_BB_4AXES) ); dispMenu.add( Button(x0+25,y0+60,25,20,"SP",ButtonOff,DATAVIEW_BUTTON_SCALE_BB_PROP) ); // [exit] exit program dispMenu.add( Button(x0 ,y0+80,75,20,"exit",ButtonOff,DATAVIEW_BUTTON_EXIT)); display_init(w,h,name); p_DV = this; display_loop(display_call,mouse_click_call,mouse_move_call); }// template instantiation#include "Box.cpp"#include "Tuple.cpp"//#include "matvecop.cpp"#ifdef _SGI_SOURCE# pragma instantiate Tuple<2,int> # pragma instantiate Tuple<4,float> # pragma instantiate Box< Tuple<2,int> ># pragma instantiate Box< Tuple<4,float> >//# pragma instantiate map<int, Button, less<int> >#endif#endif // DataView_SOURCE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -