taxplot3d_pane.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:19k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: taxplot3d_pane.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:13:45  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: taxplot3d_pane.cpp,v 1000.1 2004/06/01 21:13:45 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Vladimir Tereshkov
  35.  *
  36.  * File Description:
  37.  *    A child of CGlCanvas3d, this pane implements all basic 3d drawing functionality      
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "taxplot3d_pane.hpp"
  41. #include <gui/opengl/gldlist.hpp>
  42. #include <gui/opengl/glutils.hpp>
  43. #include <FL/glut.H>
  44. BEGIN_NCBI_SCOPE
  45. CTaxplot3dPanel::CTaxplot3dPanel(int x, int y, int w, int h, const char* label)
  46.     : CGlCanvas3d(x, y, w, h, label),       
  47.       m_Transform(CVect3<float>(0.0f, 0.0f, 0.0f), 2.0f),
  48.       m_Pivot(0,0,0),
  49.       m_Font_Bitmap8x13(CGlBitmapFont::eBitmap8x13)
  50. {   
  51.     m_Transform.Resolution(w, h);
  52.     
  53.     m_Data    = NULL;
  54.     m_Handler = NULL;
  55.     m_ViewMode          = eCamera;
  56.     m_PivotPoint        = eFloating;
  57.     m_PrimitiveShape    = eSphere;
  58.     m_State             = eNormal;
  59.     
  60.     m_bAxes   = true;
  61.     m_bGrid   = true;
  62.     m_bArrows = true;
  63.     m_bLabels = true;
  64.     m_bScale  = true;
  65.     m_bPvAttach = true;
  66.     
  67.     m_Tooltip.EnableActiveMode(static_cast<ITooltipClient*>(this));
  68.     m_Tooltip.SetMode(CTooltip::eHideOnMove);
  69. }
  70. void CTaxplot3dPanel::draw()
  71. {
  72.     x_DrawBackground(0.3f, 0.3f, 0.3f);
  73.     x_SetupView();
  74.   
  75.     static GLfloat spec[]   =   {0.5f, 0.5f ,0.5f ,1.0};  //sets specular highlight of spheres
  76.     static GLfloat posl[]   =   {2,4,3,1};                //position of ligth source
  77.     static GLfloat amb[]    =   {0.7f, 0.7f, 0.7f ,1.0f}; //global ambient
  78.     static GLfloat amb2[]   =   {0.3f, 0.3f, 0.3f ,1.0f}; //ambient of lightsource  
  79.     static float   df       =    5.0;
  80.     glClearDepth(1.0f); // Depth Buffer Setup
  81.     glEnable(GL_DEPTH_TEST); // Enables Depth Testing
  82.     glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
  83.     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
  84.     glShadeModel(GL_SMOOTH);
  85.     glEnable(GL_CULL_FACE);
  86.     glEnable(GL_DEPTH_TEST);
  87.     glEnable(GL_LINE_SMOOTH);
  88.     glMaterialfv(GL_FRONT,GL_SPECULAR,spec);
  89.     glMaterialfv(GL_FRONT,GL_SHININESS,&df);
  90.     glEnable(GL_LIGHTING);
  91.     glLightfv(GL_LIGHT0,GL_POSITION,posl);
  92.     glLightfv(GL_LIGHT0,GL_AMBIENT,amb2);
  93.     glEnable(GL_LIGHT0);
  94.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT,amb);
  95.     glEnable(GL_COLOR_MATERIAL);
  96.     glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
  97.     glEnable(GL_BLEND);
  98.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  
  99.     // move us out of center
  100.     glTranslatef(0,0,-3);
  101.     // scale
  102.     if (m_bScale) drawScale();
  103.     
  104.     // apply transformations
  105.     transformView();
  106.   
  107.     if (m_Dlist.IsValid()) {
  108.         m_Dlist.Call();
  109.     } else {
  110.     CGlDisplayListCompile COMPILE(m_Dlist, CGlDisplayList::eCompileAndExecute);        
  111.         
  112.         // bad name, not only axes
  113.         drawAxes();
  114.         // draw something real
  115.         if (m_Data){
  116.             for (unsigned int i=0; i<m_Data->getData().size(); i++){
  117.                 glPushMatrix();     
  118.                 
  119.                 CVect3<float> point(m_Data->getVertexAt(i).getXYZ());
  120.                 CVect3<float> color(m_Data->getVertexAt(i).getRGB());
  121.                 glTranslatef(point.X(), point.Y(), point.Z());
  122.                 if (m_Data->getVertexAt(i).isSelected())  glColor4f(1,0.0f,0.0f,0.7f);
  123.                 else                                      glColor4f(color.X(), color.Y(), color.Z(), 0.7f);              
  124.                 drawPrimitive();   
  125.                 glPopMatrix();         
  126.             }
  127.         }
  128.     }  
  129.     //CGlUtils::CheckGlError(); // on x-server it fails, need to trace this
  130. }
  131. // resize event handler
  132. void CTaxplot3dPanel::resize(int x, int y, int w, int h)
  133. {
  134.     m_Transform.Resolution(w, h);  
  135.     CGlCanvas3d::resize(x, y, w, h);    
  136. }
  137. // keyboard/mouse handlers
  138. int CTaxplot3dPanel::handle(int event)
  139. {
  140.     // pass events to the tooltip object
  141.     m_Tooltip.Handle(event);
  142.     switch (event) {
  143.     case FL_PUSH:
  144.         if (Fl::event_button() == 1) {
  145.         if (Fl::event_shift()) {       
  146.         m_Transform.Switch2Zoom();
  147.         m_State = eZoom;  
  148.         } else if (Fl::event_ctrl()) {
  149.         m_Transform.Switch2Pan();
  150.           m_State = ePan;                    
  151.         } else {
  152.         m_Transform.Switch2Rotate();
  153.           m_State = eRotate;                    
  154.         }   
  155.         m_Transform.Update(Fl::event_x(), Fl::event_y());
  156.         m_Transform.BeginDrag();        
  157.         draw(); // restoring current matrix, for synchronization purposes - good place for improvement
  158.         checkSelection(Fl::event_x(), Fl::event_y());
  159.         }
  160.         break;
  161.     case FL_DRAG:
  162.         m_Transform.Update(Fl::event_x(), Fl::event_y());    
  163.         redraw();
  164.         break;
  165.     case FL_RELEASE:        
  166.         m_Transform.Update(Fl::event_x(), Fl::event_y());
  167.         m_Transform.EndDrag();
  168.         m_State = eNormal;          
  169.         break;        
  170.     default:      
  171.         // let it go
  172.         return CGlCanvas3d::handle(event); 
  173.     }
  174.     
  175.     return 1; // event handled
  176. }
  177. // one point drawing
  178. void CTaxplot3dPanel::drawPrimitive()
  179. {  
  180.     switch (m_PrimitiveShape){
  181.     case eCube:{
  182.         glScalef(0.005f, 0.005f, 0.005f);
  183.         GLfloat n[6][3] = {  /* Normals for the 6 faces of a cube. */
  184.         {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
  185.         {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0} };
  186.         GLint faces[6][4] = {  /* Vertex indices for the 6 faces of a cube. */
  187.         {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
  188.         {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
  189.         GLfloat v[8][3];  /* Will be filled in with X,Y,Z vertexes. */
  190.         v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1;
  191.         v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1;
  192.         v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1;
  193.         v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1;
  194.         v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1;
  195.         v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1;
  196.         for (int i = 0; i < 6; i++) {
  197.             glBegin(GL_QUADS);
  198.             glNormal3fv(&n[i][0]);
  199.             glVertex3fv(&v[faces[i][0]][0]);
  200.             glVertex3fv(&v[faces[i][1]][0]);
  201.             glVertex3fv(&v[faces[i][2]][0]);
  202.             glVertex3fv(&v[faces[i][3]][0]);
  203.             glEnd();
  204.         }
  205.         break;
  206.     }
  207.     case eSphere:{
  208.         static GLUquadricObj *pObj = gluNewQuadric();
  209.         gluSphere(pObj, 0.005, 10,10);      
  210.         break;                
  211.     }  
  212.     case eCross:
  213.         glScalef(0.005f, 0.005f, 0.005f);
  214.         glBegin(GL_LINES);
  215.         glVertex3f( 0.0f, -1.0f, 0.0f);
  216.         glVertex3f( 0.0f, 1.0f, 0.0f);
  217.         glVertex3f( -1.0f, 0.0f, 0.0f);
  218.         glVertex3f( 1.0f, 0.0f, 0.0f);
  219.         glVertex3f( 0.0f, 0.0f, -1.0f);
  220.         glVertex3f( 0.0f, 0.0f, 1.0f);
  221.         glEnd();
  222.         break;
  223.   }
  224. }
  225. // update of data source
  226. void CTaxplot3dPanel::SetDataSource(CTaxplot3dDataSource * ds)
  227. {
  228.     m_Data = ds;
  229.     slowRedraw();
  230. }
  231. // drawing axes, labels, grid...
  232. void CTaxplot3dPanel::drawAxes()
  233. {
  234.     glPushMatrix();
  235.     glColor3f(1.0f,1.0f,1.0f);
  236.     GLUquadricObj *pObj = gluNewQuadric();
  237.     if (m_bAxes){ 
  238.         glBegin(GL_LINES);
  239.         glVertex3f( 0.0f, 0.0f, 0.0f);
  240.         glVertex3f( 0.0f, 1.0f, 0.0f);
  241.         glVertex3f( 0.0f, 0.0f, 0.0f);
  242.         glVertex3f( 1.0f, 0.0f, 0.0f);
  243.         glVertex3f( 0.0f, 0.0f, 0.0f);
  244.         glVertex3f( 0.0f, 0.0f, 1.0f);
  245.         glEnd();
  246.     }
  247.     
  248.     if (m_bGrid){        
  249.         // step selection        
  250.         double step_n   = GetBestStep(true);
  251.         
  252.         for (int i=1;  (step_n * i) <= 1; i++){
  253.             glColor4f(1.0f,1.0f,1.0f, (i%2)?0.05f:0.3f);
  254.             glBegin(GL_LINES);
  255.             glVertex3f( step_n * i, 0, 0.0f);
  256.             glVertex3f( step_n * i, 1, 0.0f);
  257.             glEnd();
  258.             glBegin(GL_LINES);
  259.             glVertex3f( step_n * i, 0, 0.0f);
  260.             glVertex3f( step_n * i, 0, 1.0f);
  261.             glEnd();
  262.             glBegin(GL_LINES);
  263.             glVertex3f(0, step_n * i, 0.0f);
  264.             glVertex3f(1, step_n * i, 0.0f);
  265.             glEnd();
  266.             glBegin(GL_LINES);
  267.             glVertex3f(0, 0.0f,  step_n * i);
  268.             glVertex3f(1, 0.0f, step_n * i);
  269.             glEnd();
  270.             glBegin(GL_LINES);
  271.             glVertex3f(0, 0.0f,  step_n * i);
  272.             glVertex3f(0, 1.0f, step_n * i);
  273.             glEnd();
  274.             glBegin(GL_LINES);
  275.             glVertex3f(0, step_n * i, 0.0f);
  276.             glVertex3f(0, step_n * i, 1.0f);
  277.             glEnd();                        
  278.          
  279.         }        
  280.     }
  281.     glPopMatrix();
  282.     // labels
  283.     if (m_Data && m_bLabels){
  284.         glColor3f(1.0f,1.0f,1.0f);
  285.         if (m_ViewMode!=eViewY) m_Font_Bitmap8x13.TextOut(0.0f, 1.07f, m_Data->yLabel().c_str());
  286.         if (m_ViewMode!=eViewX) m_Font_Bitmap8x13.TextOut(1.07f, 0.0f, m_Data->xLabel().c_str());
  287.         if (m_ViewMode!=eViewZ){
  288.         glPushMatrix();
  289.          glRotatef(90,1.0f,0.0f,0.0f);
  290.         glColor3f(1.0f,1.0f,1.0f);
  291.         m_Font_Bitmap8x13.TextOut(0.0f, 1.07f, m_Data->zLabel().c_str());
  292.         glPopMatrix();
  293.         }
  294.     }
  295. // arrows
  296.     if (m_bArrows){
  297.         if (m_ViewMode!=eViewZ){
  298.             glPushMatrix();
  299.             glColor3f(1.0f,1.0f,1.0f);
  300.             glTranslatef(0.0f,0.0f, 1.0f);
  301.             gluQuadricDrawStyle(pObj, GLU_FILL);
  302.             gluCylinder(pObj, 0.01, 0, 0.05, 20, 20);
  303.             glPopMatrix();
  304.         }
  305.         if (m_ViewMode!=eViewY){
  306.             glPushMatrix();
  307.             glColor3f(1.0f,1.0f,1.0f);
  308.             glRotatef(90,-1.0f,0.0f,0.0f);
  309.             glTranslatef(0.0f,0.0f, 1.0f);
  310.             gluQuadricDrawStyle(pObj, GLU_FILL);
  311.             gluCylinder(pObj, 0.01, 0, 0.05, 20, 20);
  312.             glPopMatrix();
  313.         }
  314.         if (m_ViewMode!=eViewX){
  315.             glPushMatrix();
  316.             glColor3f(1.0f,1.0f,1.0f);
  317.             glRotatef(90,0.0f,1.0f,0.0f);
  318.             glTranslatef(0.0f,0.0f, 1.0f);
  319.             gluQuadricDrawStyle(pObj, GLU_FILL);   
  320.             gluCylinder(pObj, 0.01, 0, 0.05, 20, 20);
  321.             glPopMatrix();
  322.         }
  323.     }
  324. }
  325. CVect3<float> CTaxplot3dPanel::GetOGLPos(int x, int y)
  326. {
  327.     GLint     viewport[4];
  328.     GLdouble  modelview[16];
  329.     GLdouble  projection[16];
  330.     GLfloat   winX, winY, winZ;
  331.     GLdouble  posX, posY, posZ;
  332.     glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
  333.     glGetDoublev( GL_PROJECTION_MATRIX, projection );
  334.     glGetIntegerv( GL_VIEWPORT, viewport );
  335.     winX = (float)x;
  336.     winY = (float)viewport[3] - (float)y;  
  337.     glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
  338.     gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
  339.     return CVect3<float>(posX, posY, posZ);
  340. }
  341. // object lookup in 3D scene
  342. int  CTaxplot3dPanel::findObject(int x, int y)
  343. {
  344.     int             foundIndex = -1;
  345.     float           delta   = 0.006f;
  346.     CVect3<float>   pos     = GetOGLPos(x, y);
  347. if (m_Data){
  348.         for (unsigned int i=0; i<m_Data->getData().size(); i++){
  349.             CVect3<float> point(m_Data->getVertexAt(i).getXYZ());
  350.             if ((pos.X()>(point.X()-delta)) &&  (pos.X()<(point.X()+delta)) &&
  351.                 (pos.Y()>(point.Y()-delta)) &&  (pos.Y()<(point.Y()+delta)) &&
  352.                 (pos.Z()>(point.Z()-delta)) &&  (pos.Z()<(point.Z()+delta))) {
  353.                 foundIndex = i;
  354.                 break;
  355.             }
  356.         }            
  357. }
  358.     return foundIndex;
  359. }
  360. void CTaxplot3dPanel::checkSelection(int x, int y)
  361. {
  362.     if (m_Data){
  363.         m_Data->dropSelection();
  364.         int curObject = findObject(x, y);
  365.         if (curObject>=0){
  366.             CVect3<float> point(m_Data->getVertexAt(curObject).getXYZ());
  367.             m_Pivot = point;
  368.             m_Data->getVertexAt(curObject).doSelect(true);   
  369.              if (m_Handler) m_Handler->fireEvent(this, ITaxplot3dCP::eSelection);               
  370.              slowRedraw();
  371.         }
  372.     }
  373. }
  374. // all view transformations for ortho and perspective projections
  375. void CTaxplot3dPanel::transformView(void)
  376.     switch (m_ViewMode){
  377.     case eCamera:                
  378.         m_Camera.SetLayout(CGlCamera::ePerspective);      
  379.         m_Camera.MakeCurrent();                                
  380.                 
  381.         switch (m_PivotPoint){
  382.         case eFloating:                        
  383.             m_Transform.ApplyGL(CGlMTransform::eZoom);                        
  384.             m_Transform.ApplyGL(CGlMTransform::ePan);            
  385.             m_Transform.ApplyGL(CGlMTransform::eRotate);            
  386.             break;
  387.         case eFixed:
  388.             m_Transform.ApplyGL(CGlMTransform::eZoom);
  389.             m_Transform.ApplyGL(CGlMTransform::eRotate);
  390.             m_Transform.ApplyGL(CGlMTransform::ePan);
  391.         }        
  392.         glRotatef(45, 1,0,0); glRotatef(45, 0,-1,0);
  393.         if (m_bPvAttach) glTranslatef(-m_Pivot.X(), -m_Pivot.Y(), -m_Pivot.Z());                
  394.         break;      
  395.     case eViewX:
  396.         switch2ortho();        
  397.         m_Transform.ApplyGL(CGlMTransform::eTranslate);
  398.         gluLookAt(0,0,0,-1,0,0,0,0,1);        
  399.         break;
  400.     case eViewY:
  401.         switch2ortho();
  402.         m_Transform.ApplyGL(CGlMTransform::eTranslate);
  403.         gluLookAt(0,0,0,0,-1,0,1,0,0);
  404.         break;
  405.     case eViewZ:
  406.         switch2ortho();
  407.         m_Transform.ApplyGL(CGlMTransform::eTranslate);
  408.         gluLookAt(0,0,0,0,0,-1,0,1,0);
  409.         break;
  410.     }
  411. }
  412. void CTaxplot3dPanel::switch2ortho(void)
  413. {   
  414.     GLfloat ratio = (m_Transform.GetTranslation().Z())/2 - 0.8;
  415.     m_Camera.SetLayout(CGlCamera::eOrtho);        
  416.     m_Camera.SetLeftPlane(ratio); m_Camera.SetRightPlane(-ratio);
  417.     m_Camera.SetTopPlane(-ratio); m_Camera.SetBottomPlane(ratio);
  418.     m_Camera.MakeCurrent();                                
  419.     glTranslatef(-0.6f, -0.6f, 0);   
  420. }
  421. void CTaxplot3dPanel::slowRedraw(void)
  422. {   
  423.     m_Dlist.Invalidate();   
  424.     redraw();
  425. }
  426. void CTaxplot3dPanel::drawScale(void)
  427. {  
  428.     float scaleSize = 0.07f;
  429.     m_Camera.SetLayout(CGlCamera::eOrtho);        
  430.     m_Camera.SetLeftPlane(-1); m_Camera.SetRightPlane(1);
  431.     m_Camera.SetTopPlane(1);  m_Camera.SetBottomPlane(-1);
  432.     m_Camera.MakeCurrent();   
  433.     glColor4f(0.0f,1.0f,0.5f,0.3f);
  434.     // graph label
  435.     string strViewMode = "Undefined";
  436.     switch (m_ViewMode){
  437.         case eViewX:    strViewMode = "Ortho YZ";       break;
  438.         case eViewY:    strViewMode = "Ortho XZ";       break;
  439.         case eViewZ:    strViewMode = "Ortho XY";       break;
  440.         case eCamera:   strViewMode = "Perspective";    break;             
  441.     }
  442.     m_Font_Bitmap8x13.TextOut(-0.9f, 0.9f, strViewMode.c_str());
  443.     string strScale = NStr::DoubleToString(GetBestStep()*2) + " x " + NStr::DoubleToString(GetBestStep()*2);
  444.     m_Font_Bitmap8x13.TextOut(-0.9f + scaleSize*2, 0.8f, strScale.c_str());    
  445.     glColor4f(1.0f,1.0f,1.0f, 0.3f);
  446.     glBegin(GL_LINE_LOOP);
  447.         glVertex3f(-0.9f, 0.8f, 0);
  448.         glVertex3f(-0.9f + scaleSize, 0.8f, 0);
  449.         glVertex3f(-0.9f + scaleSize, 0.8f + scaleSize, 0);
  450.         glVertex3f(-0.9f, 0.8f + scaleSize, 0);
  451.     glEnd();
  452.     glColor4f(1.0f,1.0f,1.0f, 0.05f);
  453.     glBegin(GL_LINES);
  454.         glVertex3f(-0.9f + scaleSize/2, 0.8f,             0);
  455.         glVertex3f(-0.9f + scaleSize/2, 0.8f+scaleSize,   0);
  456.         glVertex3f(-0.9f, 0.8f + scaleSize/2, 0);
  457.         glVertex3f(-0.9f + scaleSize, 0.8f + scaleSize/2, 0);
  458.     glEnd();
  459.     
  460.     m_Camera.ReleaseCurrent();    
  461. }
  462. double CTaxplot3dPanel::GetBestStep(bool bNorm)
  463. {
  464.     int maxTicks = 20;
  465.     int minTicks = 10;
  466.     // step selection
  467.     double scale    = m_Data?m_Data->getScale():1; 
  468.     double log      = ceil(log10(scale));
  469.     double step     = pow((double)10, log)/maxTicks;
  470.     double step_n   = step / scale;
  471.     // minimum 10 ticks
  472.     while (step_n > (1.0 / minTicks)) {step/=2; step_n/=2;}
  473.     return bNorm?step_n:step;
  474. }
  475. // tooltips implementation
  476. bool    CTaxplot3dPanel::TC_NeedTooltip(int x, int y)
  477. {
  478.     return findObject(x, y) >= 0;
  479. }
  480. string  CTaxplot3dPanel::TC_GetTooltip(int& x, int& y, int& w, int& h)
  481. {
  482.     string  toolTip   = "";
  483.     int     currIndex = findObject(x, y);    
  484.     double  scale     = m_Data?m_Data->getScale():1; 
  485.     if (currIndex >= 0) {
  486.         toolTip     = "gi: " + NStr::IntToString(m_Data->getVertexAt(currIndex).getGi());
  487.         toolTip    += "nScores:";
  488.         toolTip    += ("n" + m_Data->xLabel() + ": " + NStr::IntToString(m_Data->getVertexAt(currIndex).getXYZ().X()*scale));
  489.         toolTip    += ("n" + m_Data->yLabel() + ": " + NStr::IntToString(m_Data->getVertexAt(currIndex).getXYZ().Y()*scale));
  490.         toolTip    += ("n" + m_Data->zLabel() + ": " + NStr::IntToString(m_Data->getVertexAt(currIndex).getXYZ().Z()*scale));
  491.     }
  492.     return toolTip;
  493. }
  494. END_NCBI_SCOPE
  495. /*
  496.  * ===========================================================================
  497.  * $Log: taxplot3d_pane.cpp,v $
  498.  * Revision 1000.1  2004/06/01 21:13:45  gouriano
  499.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  500.  *
  501.  * Revision 1.4  2004/05/21 22:27:55  gorelenk
  502.  * Added PCH ncbi_pch.hpp
  503.  *
  504.  * Revision 1.3  2004/01/28 15:56:29  tereshko
  505.  * UI additions - scale, tooltips
  506.  *
  507.  * Revision 1.2  2004/01/14 16:39:22  tereshko
  508.  * Minor changes due to integration with Taxplot viewer
  509.  *
  510.  * Revision 1.1  2004/01/05 16:20:49  tereshko
  511.  * Initial revision
  512.  *
  513.  * ===========================================================================
  514.  */