marTclInterface.h

Go to the documentation of this file.
00001 #ifndef MAR__INTERFACE__TCL__HXX
00002 #define MAR__INTERFACE__TCL__HXX
00003 
00004 #include "../kernel/marInterface.h"
00005 #include <kgfo/volstat.hxx>
00006 #include <tcl.h>
00007 #include <tk.h>
00008 #include <wx/list.h>
00009 #include <wx/string.h>
00010 #include <vtkCellArray.h>
00011 #include <vtkCellLocator.h>
00012 #include <vtkImageData.h>
00013 #include <vtkMath.h>
00014 #include <vtkPoints.h>
00015 #include <vtkPolyData.h>
00016 #include <vtkTclUtil.h>
00017 
00018 // ----------------------------------------------------------------------------
00019 static marInterface MyMaracasData;
00020 static kVolume* _ucharVol = NULL;
00021 
00022 // ----------------------------------------------------------------------------
00023 void freeAllMaracasInterfaces_dll( )
00024 {
00025         MyMaracasData.reset( );
00026         if( _ucharVol ) delete _ucharVol;
00027         _ucharVol = NULL;
00028 }
00029 
00030 // ----------------------------------------------------------------------------
00031 wxStringList params_dll( )
00032 {
00033     return( MyMaracasData._parameters->getRelationalArray( ) );
00034 
00035 }
00036 
00037 // ----------------------------------------------------------------------------
00038 void setParams_dll( wxStringList& raParams )
00039 {
00040     MyMaracasData._parameters->setRelationalArray( raParams );
00041 
00042 }
00043 
00044 // ----------------------------------------------------------------------------
00045 bool saveParams_dll( std::string& fName )
00046 {
00047     return( MyMaracasData.saveParameters( std::string( fName ) ) );
00048 
00049 }
00050 
00051 // ----------------------------------------------------------------------------
00052 bool loadParams_dll( std::string& fName )
00053 {
00054     return( MyMaracasData.loadParameters( std::string( fName ) ) );
00055 
00056 }
00057 
00058 // ----------------------------------------------------------------------------
00059 void SetROIStep_dll( double vWidth )
00060 {
00061     MyMaracasData._parameters->setROIStep( vWidth );
00062 
00063 }
00064 
00065 // ----------------------------------------------------------------------------
00066 double GetActualVoxelSize_dll( ) {
00067 
00068     return( MyMaracasData._parameters->getVoxelSize( ) );
00069 
00070 }
00071 
00072 // ----------------------------------------------------------------------------
00073 wxStringList studies_dll( )
00074 {
00075     return( MyMaracasData._dicom->getStudies( ) );
00076 }
00077 
00078 // ----------------------------------------------------------------------------
00079 wxStringList studyData_dll( std::string& study )
00080 {
00081     MyMaracasData._dicom->setActualStudy( study );
00082     return( MyMaracasData._dicom->getRelationalArrayStudyData( ) );
00083 
00084 }
00085 
00086 // ----------------------------------------------------------------------------
00087 wxStringList series_dll( std::string& study )
00088 {
00089     MyMaracasData._dicom->setActualStudy( study );
00090     return( MyMaracasData._dicom->getSeries( ) );
00091 
00092 }
00093 
00094 // ----------------------------------------------------------------------------
00095 wxStringList serieData_dll( std::string& study, std::string& serie )
00096 {
00097     MyMaracasData._dicom->setActualStudy( study );
00098     MyMaracasData._dicom->setActualSerie( serie );
00099     return( MyMaracasData._dicom->getRelationalArraySerieData( ) );
00100 
00101 }
00102 
00103 // ----------------------------------------------------------------------------
00104 void SubtractSeries_dll( std::string& sl, std::string& sr, std::string& ss, std::string& description )
00105 {/*
00106    marDicom::SubtractSeries(
00107    MyMaracasData._parameters,
00108    MyMaracasData._dicom->getActualStudy( ),
00109    sl, sr,
00110    ss, description
00111    );
00112  */
00113 }
00114 
00115 // ----------------------------------------------------------------------------
00116 bool LoadImages_dll( )
00117 {
00118     MyMaracasData._dicom->loadActualSerie( );
00119     return( true );
00120 
00121 }
00122 
00123 // ----------------------------------------------------------------------------
00124 void CastVolume_dummy( )
00125 {
00126         if( _ucharVol ) delete _ucharVol;
00127         _ucharVol = new kVolume( *( MyMaracasData._dicom->getVolume( ) ) );
00128 
00129         _ucharVol->convertScale( kVolume::UCHAR, 0, 255 );
00130 
00131 }
00132 
00133 // ----------------------------------------------------------------------------
00134 void LoadTkImage_dummy( uchar** image, int w, int h,
00135                                                 std::string& tkName, Tcl_Interp* interp )
00136 {
00137     Tk_PhotoHandle hnd;
00138     Tk_PhotoImageBlock bl;
00139 
00140     hnd = Tk_FindPhoto( interp, ( char* )tkName.c_str( ) );
00141     if( hnd != NULL ) {
00142 
00143         // Image size
00144         bl.width  = w;
00145         bl.height = h;
00146 
00147         // One pixel is represented with one unsigned short value
00148         bl.pixelSize = sizeof( uchar );
00149 
00150         // We're working on intensity images i.e. no RGB
00151         bl.offset[ 0 ] = 0;
00152         bl.offset[ 1 ] = 0;
00153         bl.offset[ 2 ] = 0;
00154         bl.offset[ 3 ] = 0;
00155 
00156         // To go to next in vertical value
00157         bl.pitch = bl.pixelSize * bl.width;
00158 
00159         // Menory block
00160         bl.pixelPtr = ( uchar* )image[ 0 ];
00161 
00162         // Ok, lets do it!
00163         Tk_PhotoPutBlock( hnd, &bl, 0, 0, bl.width, bl.height );
00164 
00165     } // fi
00166 
00167 }
00168 
00169 // ----------------------------------------------------------------------------
00170 void LoadTkImages_dll( wxStringList& tkNames, Tcl_Interp* interp )
00171 {
00172     int k, w, h, d;
00173         std::string tmp;
00174 
00175     w = MyMaracasData._dicom->getVolume( )->getXdim( );
00176     h = MyMaracasData._dicom->getVolume( )->getYdim( );
00177     d = MyMaracasData._dicom->getVolume( )->getZdim( );
00178 
00179     CastVolume_dummy( );
00180         uchar*** vol = ( uchar*** )( _ucharVol->getData3D( ) );
00181     for( k = 0; k < d; k++ ) {
00182 
00183                 tmp = tkNames[ k ];
00184         LoadTkImage_dummy( vol[ k ],
00185                                                    w, h, tmp, interp );
00186 
00187     } // rof
00188 
00189 }
00190 
00191 // ----------------------------------------------------------------------------
00192 int GetNumberOfImages_dll( )
00193 {
00194     return( MyMaracasData._dicom->getVolume( )->getZdim( ) );
00195 
00196 }
00197 
00198 // ----------------------------------------------------------------------------
00199 wxStringList GetImagesNumbers_dll( )
00200 {
00201     return( MyMaracasData._dicom->getImageNumbers( ) );
00202 
00203 }
00204 
00205 // ----------------------------------------------------------------------------
00206 double GetImageIntensity_dll( int x, int y, int z )
00207 {
00208     return( MyMaracasData._dicom->getVolume( )->getPixel( x, y, z ) );
00209 
00210 }
00211 
00212 // ----------------------------------------------------------------------------
00213 ushort* GetProfilFromTotalVolume_dll( int xO, int yO, int zO,
00214                                                                                  int xF, int yF, int zF )
00215 {
00216     int i;
00217         kVolumeStat* stats = new kVolumeStat( MyMaracasData._dicom->
00218                                                                                   getVolume( ) );
00219 
00220         stats->profile( xO, yO, zO, xF, yF, zF );
00221 
00222     ushort* r = new ushort[ stats->getSize( ) + 6 ];
00223 
00224     r[ 0 ] = stats->getSize( ) + 6;
00225     r[ 1 ] = ( ushort )stats->getMin( );
00226     r[ 2 ] = ( ushort )stats->getMax( );
00227     r[ 3 ] = ( ushort )stats->getAvg( );
00228     r[ 4 ] = ( ushort )stats->getSD( );
00229     r[ 5 ] = ( ushort )stats->getSize( );
00230     for( i = 0; i < stats->getSize( ); i++ )
00231                 r[ i + 6 ] = ( ushort )( stats->getValues( ) )[ i ];
00232     return( r );
00233 
00234 }
00235 
00236 // ----------------------------------------------------------------------------
00237 void GetAreaValuesFromTotalVolume_dll( int xO, int yO, int zO,
00238                                                                            int xF, int yF, int zF,
00239                                                                            int* min, int* max, int* avg,
00240                                                                            int* sd, int* size )
00241 {
00242         kVolumeStat* stats = new kVolumeStat( MyMaracasData._dicom->getVolume( ) );
00243 
00244         stats->stats( xO, yO, zO, xF, yF, zF );
00245 
00246     *min = ( int )stats->getMin( );
00247     *max = ( int )stats->getMax( );
00248     *avg = ( int )stats->getAvg( );
00249     *sd = ( int )stats->getSD( );
00250     *size = stats->getSize( );
00251 
00252 }
00253 
00254 // ----------------------------------------------------------------------------
00255 bool SaveExperiment_dll ( std::string& fName )
00256 {
00257     return( MyMaracasData.saveExperiment( fName ) );
00258 
00259 }
00260 
00261 // ----------------------------------------------------------------------------
00262 bool LoadExperiment_dll ( std::string& fName )
00263 {
00264     return( MyMaracasData.loadExperiment( fName ) );
00265 
00266 }
00267 
00268 // ----------------------------------------------------------------------------
00269 void InitExperiment_dll ( int* voi )
00270 {
00271     MyMaracasData._experiment->setVOI( voi );
00272     MyMaracasData._experiment->initExperiment( MyMaracasData._dicom->
00273                                                                                            getVolume( ) );
00274         //if( _ucharVol ) delete _ucharVol;
00275         //_ucharVol = NULL;
00276         MyMaracasData._dicom->freeVolume( );
00277 }
00278 
00279 // ----------------------------------------------------------------------------
00280 void SetStartPoint_dll( int x, int y, int z )
00281 {
00282     MyMaracasData._experiment->setStartPoint( x, y, z );
00283 }
00284 
00285 // ----------------------------------------------------------------------------
00286 void ExtractAxes_dll( )
00287 {
00288     MyMaracasData._experiment->extractVascularTree( );
00289 }
00290 
00291 // ----------------------------------------------------------------------------
00292 int GetNumberOfAxes_dll( )
00293 {
00294     return( MyMaracasData._experiment->getNumberOfAxes( ) );
00295 }
00296 
00297 // ----------------------------------------------------------------------------
00298 vtkPolyData* GetAllAxes_dll( )
00299 {
00300     int i, n, j;
00301     double p[ marAxis::INDX_count ];
00302     marAxis* tmp;
00303 
00304     vtkPoints* allPoints = vtkPoints::New( );
00305     vtkCellArray* allTopology = vtkCellArray::New( );
00306 
00307     j = 0;
00308     for( n = 0; n < MyMaracasData._experiment->getNumberOfAxes( ); n++ ) {
00309 
00310         tmp = MyMaracasData._experiment->getAxis( );
00311         allTopology->InsertNextCell( tmp->getNumberOfControlPoints( ) );
00312         for( i = 0; i < tmp->getNumberOfControlPoints( ); i++ ) {
00313 
00314             tmp->getControlPoint( i, p, p + 3 );
00315             allPoints->InsertNextPoint( p[ 0 ], p[ 1 ], p[ 2 ] );
00316             allTopology->InsertCellPoint( j );
00317                         j++;
00318 
00319         } // rof
00320 
00321     } // rof
00322 
00323     vtkPolyData* allData = vtkPolyData::New( );
00324     allData->SetPoints( allPoints );
00325     allData->SetLines( allTopology );
00326     
00327     allPoints->Delete();
00328     allTopology->Delete();
00329 
00330     return( allData );
00331 
00332 }
00333 
00334 // ----------------------------------------------------------------------------
00335 vtkPolyData* GetActualAxis_dll( )
00336 {
00337     int i, j, h;
00338     double p[ marAxis::INDX_count ];
00339     marAxis* tmp;
00340 
00341     vtkPoints* points = vtkPoints::New( );
00342     vtkCellArray* topology = vtkCellArray::New( );
00343 
00344     j = 0;
00345     h = MyMaracasData._experiment->getDynData( )->getVolume( )->getYdim( );
00346     tmp = MyMaracasData._experiment->getAxis( );
00347     topology->InsertNextCell( tmp->getNumberOfControlPoints( ) );
00348     for( i = 0; i < tmp->getNumberOfControlPoints( ); i++ ) {
00349 
00350                 tmp->getControlPoint( i, p, p + 3 );
00351                 topology->InsertCellPoint( j++ );
00352                 points->InsertNextPoint( p[ 0 ], h - 1 - p[ 1 ], p[ 2 ] );
00353 
00354     } // rof
00355 
00356     vtkPolyData* data = vtkPolyData::New( );
00357     data->SetPoints( points );
00358     data->SetLines( topology );
00359     
00360     points->Delete();
00361     topology->Delete();
00362 
00363     return( data );
00364 }
00365 
00366 // ----------------------------------------------------------------------------
00367 int GetActualAxisNumberOfPoints_dll( )
00368 {
00369     return( MyMaracasData._experiment->getAxis( )->getNumberOfControlPoints( ) );
00370 
00371 }
00372 
00373 // ----------------------------------------------------------------------------
00374 double* GetActualAxisPoint_dll( int i )
00375 {
00376     double* ret = new double[ marAxis::INDX_count + 1 ];
00377 
00378     ret[ 0 ] = marAxis::INDX_count;
00379     MyMaracasData._experiment->getAxis( )->getControlPoint( i, ret + 1, ret + 4 );
00380     return( ret );
00381 }
00382 
00383 // ----------------------------------------------------------------------------
00384 vtkImageData* GetActualAxisSlice_dll( int i )
00385 {
00386         //    return( MyMaracasData._experiment->GetSliceImage( i ) );
00387         return( NULL );
00388 
00389 }
00390 
00391 // ----------------------------------------------------------------------------
00392 void PrepareQuantification_dll( int i )
00393 {
00394         /*
00395           MyMaracasData._experiment->SetAxis( i );
00396           MyMaracasData._experiment->PrepareQuantification( );
00397         */
00398 }
00399 
00400 // ----------------------------------------------------------------------------
00401 double GetAxisLength_dll( )
00402 {
00403     return( MyMaracasData._experiment->getAxis( )->length( ) );
00404 
00405 }
00406 
00407 // ----------------------------------------------------------------------------
00408 void GetImageRange_dll( int* min, int* max )
00409 {
00410     double m, M;
00411 
00412     MyMaracasData._experiment->getDynData( )->getVolume( )->getMinMax( m, M );
00413     *min = ( int )m;
00414     *max = ( int )M;
00415 
00416 }
00417 
00418 // ----------------------------------------------------------------------------
00419 vtkImageData* GetVTKVolume_dll( )
00420 {
00421     return( MyMaracasData._experiment->getDynData( )->getVolume( )->castVtk( ) );
00422 
00423 }
00424 
00425 // ----------------------------------------------------------------------------
00426 int IntersectWithLine_dll(
00427                                                   vtkCellLocator* iCellLocator,
00428                                                   double x1, double y1, double z1, 
00429                                                   double x2, double y2, double z2,
00430                                                   double tol, double *xI, double *yI, double *zI
00431                                                   )
00432 {
00433     float a0[ 3 ], a1[ 3 ], x[ 3 ], t, pcoords[ 3 ];
00434     int subId; 
00435 
00436     int returnVal;
00437  
00438     iCellLocator->Update( );
00439 
00440     a0[ 0 ] = x1; a0[ 1 ] = y1; a0[ 2 ] = z1;
00441     a1[ 0 ] = x2; a1[ 1 ] = y2; a1[ 2 ] = z2;
00442 
00443     returnVal = iCellLocator->IntersectWithLine( a0, a1, tol, t, x, pcoords, subId );
00444     ( *xI ) = x[ 0 ]; ( *yI ) = x[ 1 ]; ( *zI ) = x[ 2 ];
00445 
00446     return( returnVal );
00447 }
00448 
00449 // ----------------------------------------------------------------------------
00450 void TclPerpendiculars_dll(
00451                                                    double xN, double yN, double zN, double angle,
00452                                                    double *xP1, double *yP1, double *zP1,
00453                                                    double *xP2, double *yP2, double *zP2
00454                                                    )
00455 {
00456     double x[ 3 ], y[ 3 ], z[ 3 ];
00457     vtkMath* math;
00458 
00459     x[ 0 ] = xN; x[ 1 ] = yN; x[ 2 ] = zN;
00460     math = vtkMath::New( );
00461     math->Perpendiculars( x, y, z,angle );
00462     ( *xP1 ) = y[ 0 ]; ( *yP1 ) = y[ 1 ]; ( *zP1 ) = y[ 2 ];
00463     ( *xP2 ) = z[ 0 ]; ( *yP2 ) = z[ 1 ]; ( *zP2 ) = z[ 2 ];
00464     math->Delete( );
00465 }
00466 
00467 #endif // MAR__INTERFACE__TCL__HXX
00468 
00469 // EOF - interfaceTCL.hxx

Generated on 18 Mar 2010 for creaMaracasVisu_lib by  doxygen 1.6.1