Biomechanical Joint Model
 Author: Anderson Maciel

comediscretizer.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 "comediscretizer.h"
00021 #include <qfiledialog.h>
00022 #include <qspinbox.h>
00023 #include <qcursor.h>
00024 #include <qstatusbar.h>
00025 #include <qlineedit.h>
00026 //#include <comeqglwidget.h>
00027 #include <come_discretizerqglwidget.h>
00028 #include <general/come.h>
00029 #include <general/comesimulator.h>
00030 #include <general/comescenario.h>
00031 #include <bio/comemoleculescartilage.h>
00032 
00033 
00034 COME_Discretizer::COME_Discretizer()
00035  : discretizer(){
00036  
00037         scene = new COME_Scenario();
00038         sim = new COME_Simulator();
00039         sim->setScene( scene );
00040 }
00041 
00042 COME_Discretizer::COME_Discretizer( int argc, char ** argv)
00043  : discretizer(){
00044  
00045         scene = new COME_Scenario();
00046         sim = new COME_Simulator();
00047         sim->setScene( scene );
00048 
00049         if( ( argc > 1 ) && ( argc < 4 ) ){
00050                 printf("Usage: discretizer [input_file] [output_file] [scale_factor]\n" );
00051         } else if( argc == 4 ){
00052                 leScale->setText( argv[3] );
00053                 default_output_file = argv[2];
00054                 QString fileName = argv[1];
00055                 if( !fileName.isEmpty() ){
00056                         QString msg = "Loading ";
00057                         statusBar()->message( msg + fileName );
00058                         hourglass(true);
00059                         int type = CARTILAGE;    
00060                         scene->loadOrganMesh( fileName.latin1(), type, atof( leScale->text() ) );
00061                         openglArea->setScene( scene );
00062                         openglArea->setGlobal( (COME*)this );
00063                         statusBar()->message( "Loaded.", 2000 );
00064                         hourglass(false);
00065                         
00066                         // Set scene radius for view
00067                         double sceneRadius = 0.01;
00068                         COME_Point3D mins, maxs;
00069                         list<COME_BioStructure*>::const_iterator iterOrgans;
00070                         for( iterOrgans = ((list<COME_BioStructure *>*)scene->getPatient(0)->getPtOrganList())->begin(); iterOrgans != ((list<COME_BioStructure *>*)scene->getPatient(0)->getPtOrganList())->end(); iterOrgans++  ){
00071                                 
00072                                 ((COME_MoleculesCartilage*)(*iterOrgans))->getSurface()->getEnvelop( mins, maxs );
00073                                 //sceneRadius = mins.vpDistance( maxs ) > sceneRadius ? mins.vpDistance( maxs ) : sceneRadius;
00074                                 sceneRadius = mins.vpDistance( COME_Point3D() ) > sceneRadius ? mins.vpDistance( COME_Point3D() ) : sceneRadius;
00075                                 sceneRadius = maxs.vpDistance( COME_Point3D() ) > sceneRadius ? maxs.vpDistance( COME_Point3D() ) : sceneRadius;
00076                         }
00077                         openglArea->setSceneRadius( sceneRadius + sceneRadius*0.1 );
00078                         openglArea->camera()->showEntireScene();
00079                 }
00080         }
00081 }
00082 
00083 
00084 COME_Discretizer::~COME_Discretizer(){
00085 
00086         delete scene;
00087         delete sim;
00088 }
00089 
00090 void
00091 COME_Discretizer::fileOpen(){
00092 
00093         QString fileName = QFileDialog::getOpenFileName(
00094                     ".",
00095                     "Mesh files (*.iv *.vtk *.wrl)",
00096                     this,
00097                     "open file dialog"
00098                     "Choose a file" );
00099         if( !fileName.isEmpty() ){
00100                 QString msg = "Loading ";
00101                 statusBar()->message( msg + fileName );
00102                 hourglass(true);
00103                 int type = CARTILAGE;    
00104                 scene->loadOrganMesh( fileName.latin1(), type, atof( leScale->text() ) );
00105                 openglArea->setScene( scene );
00106                 openglArea->setGlobal( (COME*)this );
00107                 statusBar()->message( "Loaded.", 2000 );
00108                 hourglass(false);
00109                 
00110                 // Set scene radius for view
00111                 double sceneRadius = 0.01;
00112                 COME_Point3D mins, maxs;
00113                 list<COME_BioStructure*>::const_iterator iterOrgans;
00114                 for( iterOrgans = ((list<COME_BioStructure *>*)scene->getPatient(0)->getPtOrganList())->begin(); iterOrgans != ((list<COME_BioStructure *>*)scene->getPatient(0)->getPtOrganList())->end(); iterOrgans++  ){
00115                         
00116                         ((COME_MoleculesCartilage*)(*iterOrgans))->getSurface()->getEnvelop( mins, maxs );
00117                         //sceneRadius = mins.vpDistance( maxs ) > sceneRadius ? mins.vpDistance( maxs ) : sceneRadius;
00118                         sceneRadius = mins.vpDistance( COME_Point3D() ) > sceneRadius ? mins.vpDistance( COME_Point3D() ) : sceneRadius;
00119                         sceneRadius = maxs.vpDistance( COME_Point3D() ) > sceneRadius ? maxs.vpDistance( COME_Point3D() ) : sceneRadius;
00120                 }
00121                 openglArea->setSceneRadius( sceneRadius + sceneRadius*0.1 );
00122                 openglArea->camera()->showEntireScene();
00123         }
00124 }
00125 
00126 void
00127 COME_Discretizer::fileExportAs(){
00128 
00129         QString fileName;
00130         QFileDialog* fd = new QFileDialog( this, "save as dialog", TRUE );
00131         fd->setCaption( "Export molecules file as...");
00132         fd->setMode( QFileDialog::AnyFile );
00133         fd->setFilter( "Molecules (*.xml)" );
00134         if( default_output_file != "" )
00135                 fd->setSelection( default_output_file.c_str() );
00136         
00137         if ( fd->exec() == QDialog::Accepted ){
00138                 hourglass(true);
00139                 fileName = fd->selectedFile();
00140                 printf( "Saving %s... ", fileName.latin1() );
00141                 scene->saveFile( fileName.latin1(), sim );
00142                 printf( " saved.\n" );
00143                 hourglass(false);
00144         }
00145     
00146 }
00147 
00148 void
00149 COME_Discretizer::updateSampling(){
00150 
00151         if( scene ){
00152                 statusBar()->message( "Updating...");
00153                 hourglass(true);
00154                 scene->lock();
00155 
00156                 //Main loop: For each organ re-sample
00157                 list<COME_BioStructure*>::const_iterator iterOrgans;
00158                 for( iterOrgans = ((list<COME_BioStructure *>*)scene->getPatient(0)->getPtOrganList())->begin(); iterOrgans != ((list<COME_BioStructure *>*)scene->getPatient(0)->getPtOrganList())->end(); iterOrgans++  ){
00159                         
00160                         ((COME_MoleculesCartilage*)(*iterOrgans))->discretize( BEST, ((double)sbDistance->value())/1000.0, ((double)sbRadius->value())/1000.0 );
00161 
00162                 }
00163                 scene->unlock();
00164                 // Simulate physics here to balance distances between molecules
00165                 sim->setFPS(600);
00166                 sim->setDuration(1);
00167                 //sim->start();
00168                 
00169                 scene->lock();
00170                 list<COME_Molecule*>::iterator iter;
00171                 for (iter = scene->getPatient(0)->getOrgan( 0 )->getTissue()->getShape()->begin(); iter != scene->getPatient(0)->getOrgan( 0 )->getTissue()->getShape()->end(); iter++){
00172                         (*iter)->setFixed(false);
00173                         (*iter)->setDescription("free");
00174                 }
00175                 scene->unlock();
00176                 
00177                 statusBar()->message( "Updated.", 2000 );
00178                 hourglass(false);
00179         }
00180 
00181 }
00182 
00183 void
00184 COME_Discretizer::hourglass( bool yesno ){
00185 
00186         if( yesno ){
00187                 setCursor( Qt::WaitCursor );
00188                 openglArea->setCursor( Qt::WaitCursor );
00189         } else {
00190                 setCursor( Qt::ArrowCursor );
00191                 openglArea->setCursor( Qt::ArrowCursor );
00192         }
00193 }

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