Biomechanical Joint Model
 Author: Anderson Maciel

come_mechatestqglwidget.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2004 by Anderson Maciel                                 *
00003  *   andi.maciel@gmail.com                                                   *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00019  ***************************************************************************/
00020 #include <come_mechatestqglwidget.h>
00021 #include <comemechatester.h>
00022 #include <general/comescenario.h>
00023 #include <general/comesimulator.h>
00024 #include <qcheckbox.h>
00025 #include <qtimer.h>
00026 #include <qcursor.h>
00027 #include <qslider.h>
00028 #include <qpopupmenu.h>
00029 #include <qspinbox.h>
00030 #include <qstatusbar.h>
00031 #include <qlistbox.h>
00032 #include <qlcdnumber.h>
00033 #include <GL/glut.h>
00034 
00035 double oldClock;
00036 
00037 
00038 COME_MechatestQGLWidget::COME_MechatestQGLWidget( QWidget *parent, const char *name )
00039  : COME_QGLWidget( parent, name )
00040 {
00041         oldClock = 0.0;
00042 }
00043 
00044 
00045 COME_MechatestQGLWidget::~COME_MechatestQGLWidget()
00046 {
00047 }
00048 
00049 void
00050 COME_MechatestQGLWidget::draw(){
00051 
00052         //CGparameter 
00053         //cgGLSetParameter3fv(cgGetNamedParameter(fragmentProgram, "lightColor"), lightColor);
00054         
00055         
00056         if( scene ){
00057 
00058                 // Display simulation data
00059                 if( ((COME_Mechatester*)getGlobal())->sim->isRunning() ){
00060                         
00061                         char chrClock[10];
00062                         sprintf( chrClock, "%2.4f", ((COME_Mechatester*)getGlobal())->sim->getClock() );
00063                         ((COME_Mechatester*)getGlobal())->lcdForceClock->display(chrClock);
00064                         ((COME_Mechatester*)getGlobal())->lcdDispClock->display(chrClock);
00065                         ((COME_Mechatester*)getGlobal())->updateEquation();
00066                 }
00067 
00068                 scene->lock();
00069 
00070                 // Update clamp attach
00071                 //((COME_Mechatester*)getGlobal())->updateClampIntersections();
00072 
00073                 //Main loop: For each organ display the object
00074                 list<COME_BioStructure*>::const_iterator iterOrgans;
00075                 int organName = 0;
00076                 for( iterOrgans = ((list<COME_BioStructure *>*)scene->getPatient(0)->getPtOrganList())->begin(); iterOrgans != ((list<COME_BioStructure *>*)scene->getPatient(0)->getPtOrganList())->end(); iterOrgans++  ){
00077                         list<COME_Molecule*>::const_iterator iterCells;
00078                         glPushName(organName++);
00079                 
00080                         //Draw the Sphere Model                 
00081                         if (((COME_Mechatester*)getGlobal())->cbSpheres->isChecked()){
00082                                 for ( iterCells = (*iterOrgans)->getTissue()->getShape()->begin(); iterCells != (*iterOrgans)->getTissue()->getShape()->end(); iterCells++ ){
00083                                         
00084                                         COME_Point3D position = (*iterCells)->getGlobalPosition();
00085                                         glPushMatrix();
00086                                                 glTranslatef(position.getX(),position.getY(),position.getZ());
00087                                 
00088                                                 if( (*iterCells)->intersectClamp() ){
00089                                                         glColor3f( 1.0 - (*iterCells)->getMaterial()->getColor().getPointAsArray()[0], 1.0 - (*iterCells)->getMaterial()->getColor().getPointAsArray()[1], 1.0 - (*iterCells)->getMaterial()->getColor().getPointAsArray()[2]);
00090                                                 } else {
00091                                                         glColor3f((*iterCells)->getMaterial()->getColor().getPointAsArray()[0],(*iterCells)->getMaterial()->getColor().getPointAsArray()[1],(*iterCells)->getMaterial()->getColor().getPointAsArray()[2]);
00092                                                 }
00093                                                 glutSolidSphere((*iterCells)->getRadius()*((double)((COME_Mechatester*)getGlobal())->sliderScale->value()/100.0), 15, 15);
00094                                         glPopMatrix();
00095                                         
00096                                         if( ((COME_Mechatester*)getGlobal())->cbLinks->isChecked() ){
00097                                                 list<COME_MoleculeLink*>::iterator iterThis;
00098                                                 glDisable(GL_LIGHTING);
00099                                                 for(iterThis = (*iterCells)->getConnectionList()->begin(); !( iterThis == (*iterCells)->getConnectionList()->end() ); iterThis++){
00100                                                         COME_Point3D position2 = (*iterThis)->getOtherElement((*iterCells))->getGlobalPosition();
00101                                                         glBegin(GL_LINES);
00102                                                                 glColor3f(0.9,0.9,0.9);
00103                                                                 glVertex3f(position.getX(),position.getY(),position.getZ());
00104                                                                 glVertex3f(position2.getX(),position2.getY(),position2.getZ());
00105                                                         glEnd();
00106                                                 }
00107                                                 glEnable(GL_LIGHTING);
00108                                         }
00109                                 }
00110                         }
00111 
00112 
00113                         //Draw the Mesh Model
00114                         COME::flagSkinning = false;
00115                         if(((COME_Mechatester*)getGlobal())->cbMesh->isChecked() || ( (*iterOrgans)->getDescription() == "clamp0" ) || ( (*iterOrgans)->getDescription() == "clamp1" ) ){
00116                                 COME::flagSkinning = true;
00117                                 COME_Mesh* mesh = (*iterOrgans)->getPointerToSurface();
00118                                 if( mesh ){
00119                                         vector <COME_Face> faces = mesh->getFaces();
00120                                         vector<COME_Vertex3D>* allVertices = mesh->getVerticesGlobalPt();
00121         
00122                                         for (int i = 0; faces.size()> i; i++){
00123                                                 
00124                                                 glColor3f(faces[i].getColor()[0],faces[i].getColor()[1],faces[i].getColor()[2]);
00125                                                 
00126                                                 //Draw Mesh Triangles
00127                                                 glBegin(GL_TRIANGLES);
00128                                                         for ( int j=0;j<3;j++){
00129                                                                 int indexVertex = faces[i].getIndexVertex(j); 
00130                                                                 COME_Vector3D normal = allVertices->at(indexVertex).getNormalGlobalPosition();
00131                                                                 glNormal3f(normal.x,normal.y,normal.z);
00132                                                                 //printf( "NORMALS: %f %f %f \n", normal.x,normal.y,normal.z );
00133                                                                 COME_Vertex3D vertex = allVertices->at(indexVertex);
00134                                                                 glVertex3d(vertex.x,vertex.y,vertex.z);
00135                                                         }
00136                                                 glEnd();
00137                                                 if(((COME_Mechatester*)getGlobal())->cbNormals->isChecked()){
00138                                                         for ( int k=0;k<3;k++){
00139                                                                 int indexVertex = faces[i].getIndexVertex(k); 
00140                                                                 COME_Vector3D normal = allVertices->at(indexVertex).getNormalGlobalPosition();
00141                                                                 COME_Vertex3D vertex = allVertices->at(indexVertex);
00142                                                                 glBegin(GL_LINES);
00143                                                                 glColor3f(0.5,0.5,0.5);
00144                                                                 glVertex3f(vertex.x,vertex.y,vertex.z);
00145                                                                 glVertex3f(vertex.x+(sceneRadius()/20.0*normal.x),vertex.y+(sceneRadius()/20.0*normal.y), vertex.z+(sceneRadius()/20.0*normal.z));
00146                                                                 glEnd();
00147                                                         }
00148                                                 }
00149                                         }
00150                                 }
00151                                 //}
00152                         }
00153                         COME::flagSkinning = true;
00154                         glPopName();
00155                 }
00156                 scene->unlock();
00157                 
00158                 if (((COME_Mechatester*)getGlobal())->cbMakeMovie->isChecked())
00159                         if( oldClock < ((COME_Mechatester*)getGlobal())->sim->getClock() ){
00160                                 saveSnapshot(true, true); // Warning, overwrite mode
00161                                 oldClock = ((COME_Mechatester*)getGlobal())->sim->getClock();
00162                                 oldClock = 0.0;
00163                         }
00164         }
00165 
00166 }
00167 
00168 void
00169 COME_MechatestQGLWidget::keyPressEvent(QKeyEvent *e){
00170 
00171   // Get event state key
00172   const Qt::ButtonState state = (Qt::ButtonState)(e->state() & Qt::KeyButtonMask);
00173   // Bug in Qt : use 0x0f00 instead of Qt::KeyButtonMask with Qt versions < 3.1
00174 
00175   oldClock = 0.0;
00176   
00177   // A simple switch on e->key() is not sufficient if we want to take state key into account.
00178   // With a switch, it would have been impossible to separate 'F' from 'CTRL+F'.
00179   // That's why we use imbricated if...else and a "handled" boolean.
00180   bool handled = false;
00181   switch( e->key() ){
00182 
00183         case Qt::Key_Right:
00184                 if(state==Qt::ShiftButton){
00185                         ((COME_Mechatester*)getGlobal())->rotateSelected( 1, 0, 0 );
00186                         handled = true;
00187                 } else
00188                 if(state==Qt::ControlButton){
00189                         ((COME_Mechatester*)getGlobal())->translateSelected( 1, 0, 0 );
00190                         handled = true;
00191                 } else
00192                 if(state==Qt::AltButton){
00193                         ((COME_Mechatester*)getGlobal())->scaleSelected( 1, 0, 0 );
00194                         handled = true;
00195                 }
00196                 break;
00197         case Qt::Key_Left:
00198                 if(state==Qt::ShiftButton){
00199                         ((COME_Mechatester*)getGlobal())->rotateSelected( -1, 0, 0 );
00200                         handled = true;
00201                 } else
00202                 if(state==Qt::ControlButton){
00203                         ((COME_Mechatester*)getGlobal())->translateSelected( -1, 0, 0 );
00204                         handled = true;
00205                 } else
00206                 if(state==Qt::AltButton){
00207                         ((COME_Mechatester*)getGlobal())->scaleSelected( -1, 0, 0 );
00208                         handled = true;
00209                 }
00210                 break;
00211         case Qt::Key_Up:
00212                 if(state==Qt::ShiftButton){
00213                         ((COME_Mechatester*)getGlobal())->rotateSelected( 0, 1, 0 );
00214                         handled = true;
00215                 } else
00216                 if(state==Qt::ControlButton){
00217                         ((COME_Mechatester*)getGlobal())->translateSelected( 0, 1, 0 );
00218                         handled = true;
00219                 } else
00220                 if(state==Qt::AltButton){
00221                         ((COME_Mechatester*)getGlobal())->scaleSelected( 0, 1, 0 );
00222                         handled = true;
00223                 }
00224                 break;
00225         case Qt::Key_Down:
00226                 if(state==Qt::ShiftButton){
00227                         ((COME_Mechatester*)getGlobal())->rotateSelected( 0, -1, 0 );
00228                         handled = true;
00229                 } else
00230                 if(state==Qt::ControlButton){
00231                         ((COME_Mechatester*)getGlobal())->translateSelected( 0, -1, 0 );
00232                         handled = true;
00233                 } else
00234                 if(state==Qt::AltButton){
00235                         ((COME_Mechatester*)getGlobal())->scaleSelected( 0, -1, 0 );
00236                         handled = true;
00237                 }
00238                 break;
00239         case Qt::Key_PageUp:
00240                 if(state==Qt::ShiftButton){
00241                         ((COME_Mechatester*)getGlobal())->rotateSelected( 0, 0, 1 );
00242                         handled = true;
00243                 } else
00244                 if(state==Qt::ControlButton){
00245                         ((COME_Mechatester*)getGlobal())->translateSelected( 0, 0, 1 );
00246                         handled = true;
00247                 } else
00248                 if(state==Qt::AltButton){
00249                         ((COME_Mechatester*)getGlobal())->scaleSelected( 0, 0, 1 );
00250                         handled = true;
00251                 }
00252                 break;
00253         case Qt::Key_PageDown:
00254                 if(state==Qt::ShiftButton){
00255                         ((COME_Mechatester*)getGlobal())->rotateSelected( 0, 0, -1 );
00256                         handled = true;
00257                 } else
00258                 if(state==Qt::ControlButton){
00259                         ((COME_Mechatester*)getGlobal())->translateSelected( 0, 0, -1 );
00260                         handled = true;
00261                 } else
00262                 if(state==Qt::AltButton){
00263                         ((COME_Mechatester*)getGlobal())->scaleSelected( 0, 0, -1 );
00264                         handled = true;
00265                 }
00266                 break;
00267   }
00268 
00269         if (!handled){
00270                 COME_QGLWidget::keyPressEvent(e);
00271         } else {
00272                 updateGL();
00273         }
00274 }
00275 
00276 void
00277 COME_MechatestQGLWidget::postSelection(const QPoint& point){
00278 
00279         if( selectedName() == -1)
00280         {
00281                 // Unselect all if no object is selected.
00282                 scene->getPatient(0)->unselectAll();
00283                 ((COME_Mechatester*)getGlobal())->statusBar()->message( "No object selected.", 1000 );
00284         }
00285         else {
00286                 scene->getPatient(0)->unselectAll();
00287                 scene->getPatient(0)->getOrgan( selectedName() )->select(true);
00288                 if( scene->getPatient(0)->getSelected()->getTissue()->getShape()->begin() != scene->getPatient(0)->getSelected()->getTissue()->getShape()->end() ){
00289                         ((COME_Mechatester*)getGlobal())->listMaterials->setSelected( ((COME_Mechatester*)getGlobal())->listMaterials->findItem ( scene->getPatient(0)->getSelected()->getTissue()->getShape()->front()->getMaterial()->getDescription().c_str() ), true );
00290                         ((COME_Mechatester*)getGlobal())->loadMaterialProperties();
00291                 }
00292                 char chMessage[30];
00293                 sprintf( chMessage, "Object %d selected.", selectedName() );
00294                 ((COME_Mechatester*)getGlobal())->statusBar()->message( chMessage, 1000 );
00295         }
00296 
00297 }
00298 
00299 void
00300 COME_MechatestQGLWidget::drawWithNames(){
00301 
00302         draw();
00303 }

Generated on Thu Dec 1 10:13:32 2005 for COME - Biomechanical Joint Model by  doxygen 1.4.5