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
00107
00108
00109
00110
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
00144 bl.width = w;
00145 bl.height = h;
00146
00147
00148 bl.pixelSize = sizeof( uchar );
00149
00150
00151 bl.offset[ 0 ] = 0;
00152 bl.offset[ 1 ] = 0;
00153 bl.offset[ 2 ] = 0;
00154 bl.offset[ 3 ] = 0;
00155
00156
00157 bl.pitch = bl.pixelSize * bl.width;
00158
00159
00160 bl.pixelPtr = ( uchar* )image[ 0 ];
00161
00162
00163 Tk_PhotoPutBlock( hnd, &bl, 0, 0, bl.width, bl.height );
00164
00165 }
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 }
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
00275
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 }
00320
00321 }
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 }
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
00387 return( NULL );
00388
00389 }
00390
00391
00392 void PrepareQuantification_dll( int i )
00393 {
00394
00395
00396
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