1 #ifndef MAR__INTERFACE__TCL__HXX
2 #define MAR__INTERFACE__TCL__HXX
4 #include "../kernel/marInterface.h"
5 #include <kgfo/volstat.hxx>
10 #include <vtkCellArray.h>
11 #include <vtkCellLocator.h>
12 #include <vtkImageData.h>
14 #include <vtkPoints.h>
15 #include <vtkPolyData.h>
16 #include <vtkTclUtil.h>
18 // ----------------------------------------------------------------------------
19 static marInterface MyMaracasData;
20 static kVolume* _ucharVol = NULL;
22 // ----------------------------------------------------------------------------
23 void freeAllMaracasInterfaces_dll( )
25 MyMaracasData.reset( );
26 if( _ucharVol ) delete _ucharVol;
30 // ----------------------------------------------------------------------------
31 wxStringList params_dll( )
33 return( MyMaracasData._parameters->getRelationalArray( ) );
37 // ----------------------------------------------------------------------------
38 void setParams_dll( wxStringList& raParams )
40 MyMaracasData._parameters->setRelationalArray( raParams );
44 // ----------------------------------------------------------------------------
45 bool saveParams_dll( std::string& fName )
47 return( MyMaracasData.saveParameters( std::string( fName ) ) );
51 // ----------------------------------------------------------------------------
52 bool loadParams_dll( std::string& fName )
54 return( MyMaracasData.loadParameters( std::string( fName ) ) );
58 // ----------------------------------------------------------------------------
59 void SetROIStep_dll( double vWidth )
61 MyMaracasData._parameters->setROIStep( vWidth );
65 // ----------------------------------------------------------------------------
66 double GetActualVoxelSize_dll( ) {
68 return( MyMaracasData._parameters->getVoxelSize( ) );
72 // ----------------------------------------------------------------------------
73 wxStringList studies_dll( )
75 return( MyMaracasData._dicom->getStudies( ) );
78 // ----------------------------------------------------------------------------
79 wxStringList studyData_dll( std::string& study )
81 MyMaracasData._dicom->setActualStudy( study );
82 return( MyMaracasData._dicom->getRelationalArrayStudyData( ) );
86 // ----------------------------------------------------------------------------
87 wxStringList series_dll( std::string& study )
89 MyMaracasData._dicom->setActualStudy( study );
90 return( MyMaracasData._dicom->getSeries( ) );
94 // ----------------------------------------------------------------------------
95 wxStringList serieData_dll( std::string& study, std::string& serie )
97 MyMaracasData._dicom->setActualStudy( study );
98 MyMaracasData._dicom->setActualSerie( serie );
99 return( MyMaracasData._dicom->getRelationalArraySerieData( ) );
103 // ----------------------------------------------------------------------------
104 void SubtractSeries_dll( std::string& sl, std::string& sr, std::string& ss, std::string& description )
106 marDicom::SubtractSeries(
107 MyMaracasData._parameters,
108 MyMaracasData._dicom->getActualStudy( ),
115 // ----------------------------------------------------------------------------
116 bool LoadImages_dll( )
118 MyMaracasData._dicom->loadActualSerie( );
123 // ----------------------------------------------------------------------------
124 void CastVolume_dummy( )
126 if( _ucharVol ) delete _ucharVol;
127 _ucharVol = new kVolume( *( MyMaracasData._dicom->getVolume( ) ) );
129 _ucharVol->convertScale( kVolume::UCHAR, 0, 255 );
133 // ----------------------------------------------------------------------------
134 void LoadTkImage_dummy( uchar** image, int w, int h,
135 std::string& tkName, Tcl_Interp* interp )
138 Tk_PhotoImageBlock bl;
140 hnd = Tk_FindPhoto( interp, ( char* )tkName.c_str( ) );
147 // One pixel is represented with one unsigned short value
148 bl.pixelSize = sizeof( uchar );
150 // We're working on intensity images i.e. no RGB
156 // To go to next in vertical value
157 bl.pitch = bl.pixelSize * bl.width;
160 bl.pixelPtr = ( uchar* )image[ 0 ];
163 Tk_PhotoPutBlock( hnd, &bl, 0, 0, bl.width, bl.height );
169 // ----------------------------------------------------------------------------
170 void LoadTkImages_dll( wxStringList& tkNames, Tcl_Interp* interp )
175 w = MyMaracasData._dicom->getVolume( )->getXdim( );
176 h = MyMaracasData._dicom->getVolume( )->getYdim( );
177 d = MyMaracasData._dicom->getVolume( )->getZdim( );
180 uchar*** vol = ( uchar*** )( _ucharVol->getData3D( ) );
181 for( k = 0; k < d; k++ ) {
184 LoadTkImage_dummy( vol[ k ],
191 // ----------------------------------------------------------------------------
192 int GetNumberOfImages_dll( )
194 return( MyMaracasData._dicom->getVolume( )->getZdim( ) );
198 // ----------------------------------------------------------------------------
199 wxStringList GetImagesNumbers_dll( )
201 return( MyMaracasData._dicom->getImageNumbers( ) );
205 // ----------------------------------------------------------------------------
206 double GetImageIntensity_dll( int x, int y, int z )
208 return( MyMaracasData._dicom->getVolume( )->getPixel( x, y, z ) );
212 // ----------------------------------------------------------------------------
213 ushort* GetProfilFromTotalVolume_dll( int xO, int yO, int zO,
214 int xF, int yF, int zF )
217 kVolumeStat* stats = new kVolumeStat( MyMaracasData._dicom->
220 stats->profile( xO, yO, zO, xF, yF, zF );
222 ushort* r = new ushort[ stats->getSize( ) + 6 ];
224 r[ 0 ] = stats->getSize( ) + 6;
225 r[ 1 ] = ( ushort )stats->getMin( );
226 r[ 2 ] = ( ushort )stats->getMax( );
227 r[ 3 ] = ( ushort )stats->getAvg( );
228 r[ 4 ] = ( ushort )stats->getSD( );
229 r[ 5 ] = ( ushort )stats->getSize( );
230 for( i = 0; i < stats->getSize( ); i++ )
231 r[ i + 6 ] = ( ushort )( stats->getValues( ) )[ i ];
236 // ----------------------------------------------------------------------------
237 void GetAreaValuesFromTotalVolume_dll( int xO, int yO, int zO,
238 int xF, int yF, int zF,
239 int* min, int* max, int* avg,
242 kVolumeStat* stats = new kVolumeStat( MyMaracasData._dicom->getVolume( ) );
244 stats->stats( xO, yO, zO, xF, yF, zF );
246 *min = ( int )stats->getMin( );
247 *max = ( int )stats->getMax( );
248 *avg = ( int )stats->getAvg( );
249 *sd = ( int )stats->getSD( );
250 *size = stats->getSize( );
254 // ----------------------------------------------------------------------------
255 bool SaveExperiment_dll ( std::string& fName )
257 return( MyMaracasData.saveExperiment( fName ) );
261 // ----------------------------------------------------------------------------
262 bool LoadExperiment_dll ( std::string& fName )
264 return( MyMaracasData.loadExperiment( fName ) );
268 // ----------------------------------------------------------------------------
269 void InitExperiment_dll ( int* voi )
271 MyMaracasData._experiment->setVOI( voi );
272 MyMaracasData._experiment->initExperiment( MyMaracasData._dicom->
274 //if( _ucharVol ) delete _ucharVol;
276 MyMaracasData._dicom->freeVolume( );
279 // ----------------------------------------------------------------------------
280 void SetStartPoint_dll( int x, int y, int z )
282 MyMaracasData._experiment->setStartPoint( x, y, z );
285 // ----------------------------------------------------------------------------
286 void ExtractAxes_dll( )
288 MyMaracasData._experiment->extractVascularTree( );
291 // ----------------------------------------------------------------------------
292 int GetNumberOfAxes_dll( )
294 return( MyMaracasData._experiment->getNumberOfAxes( ) );
297 // ----------------------------------------------------------------------------
298 vtkPolyData* GetAllAxes_dll( )
301 double p[ marAxis::INDX_count ];
304 vtkPoints* allPoints = vtkPoints::New( );
305 vtkCellArray* allTopology = vtkCellArray::New( );
308 for( n = 0; n < MyMaracasData._experiment->getNumberOfAxes( ); n++ ) {
310 tmp = MyMaracasData._experiment->getAxis( );
311 allTopology->InsertNextCell( tmp->getNumberOfControlPoints( ) );
312 for( i = 0; i < tmp->getNumberOfControlPoints( ); i++ ) {
314 tmp->getControlPoint( i, p, p + 3 );
315 allPoints->InsertNextPoint( p[ 0 ], p[ 1 ], p[ 2 ] );
316 allTopology->InsertCellPoint( j );
323 vtkPolyData* allData = vtkPolyData::New( );
324 allData->SetPoints( allPoints );
325 allData->SetLines( allTopology );
328 allTopology->Delete();
334 // ----------------------------------------------------------------------------
335 vtkPolyData* GetActualAxis_dll( )
338 double p[ marAxis::INDX_count ];
341 vtkPoints* points = vtkPoints::New( );
342 vtkCellArray* topology = vtkCellArray::New( );
345 h = MyMaracasData._experiment->getDynData( )->getVolume( )->getYdim( );
346 tmp = MyMaracasData._experiment->getAxis( );
347 topology->InsertNextCell( tmp->getNumberOfControlPoints( ) );
348 for( i = 0; i < tmp->getNumberOfControlPoints( ); i++ ) {
350 tmp->getControlPoint( i, p, p + 3 );
351 topology->InsertCellPoint( j++ );
352 points->InsertNextPoint( p[ 0 ], h - 1 - p[ 1 ], p[ 2 ] );
356 vtkPolyData* data = vtkPolyData::New( );
357 data->SetPoints( points );
358 data->SetLines( topology );
366 // ----------------------------------------------------------------------------
367 int GetActualAxisNumberOfPoints_dll( )
369 return( MyMaracasData._experiment->getAxis( )->getNumberOfControlPoints( ) );
373 // ----------------------------------------------------------------------------
374 double* GetActualAxisPoint_dll( int i )
376 double* ret = new double[ marAxis::INDX_count + 1 ];
378 ret[ 0 ] = marAxis::INDX_count;
379 MyMaracasData._experiment->getAxis( )->getControlPoint( i, ret + 1, ret + 4 );
383 // ----------------------------------------------------------------------------
384 vtkImageData* GetActualAxisSlice_dll( int i )
386 // return( MyMaracasData._experiment->GetSliceImage( i ) );
391 // ----------------------------------------------------------------------------
392 void PrepareQuantification_dll( int i )
395 MyMaracasData._experiment->SetAxis( i );
396 MyMaracasData._experiment->PrepareQuantification( );
400 // ----------------------------------------------------------------------------
401 double GetAxisLength_dll( )
403 return( MyMaracasData._experiment->getAxis( )->length( ) );
407 // ----------------------------------------------------------------------------
408 void GetImageRange_dll( int* min, int* max )
412 MyMaracasData._experiment->getDynData( )->getVolume( )->getMinMax( m, M );
418 // ----------------------------------------------------------------------------
419 vtkImageData* GetVTKVolume_dll( )
421 return( MyMaracasData._experiment->getDynData( )->getVolume( )->castVtk( ) );
425 // ----------------------------------------------------------------------------
426 int IntersectWithLine_dll(
427 vtkCellLocator* iCellLocator,
428 double x1, double y1, double z1,
429 double x2, double y2, double z2,
430 double tol, double *xI, double *yI, double *zI
433 float a0[ 3 ], a1[ 3 ], x[ 3 ], t, pcoords[ 3 ];
438 iCellLocator->Update( );
440 a0[ 0 ] = x1; a0[ 1 ] = y1; a0[ 2 ] = z1;
441 a1[ 0 ] = x2; a1[ 1 ] = y2; a1[ 2 ] = z2;
443 returnVal = iCellLocator->IntersectWithLine( a0, a1, tol, t, x, pcoords, subId );
444 ( *xI ) = x[ 0 ]; ( *yI ) = x[ 1 ]; ( *zI ) = x[ 2 ];
449 // ----------------------------------------------------------------------------
450 void TclPerpendiculars_dll(
451 double xN, double yN, double zN, double angle,
452 double *xP1, double *yP1, double *zP1,
453 double *xP2, double *yP2, double *zP2
456 double x[ 3 ], y[ 3 ], z[ 3 ];
459 x[ 0 ] = xN; x[ 1 ] = yN; x[ 2 ] = zN;
460 math = vtkMath::New( );
461 math->Perpendiculars( x, y, z,angle );
462 ( *xP1 ) = y[ 0 ]; ( *yP1 ) = y[ 1 ]; ( *zP1 ) = y[ 2 ];
463 ( *xP2 ) = z[ 0 ]; ( *yP2 ) = z[ 1 ]; ( *zP2 ) = z[ 2 ];
467 #endif // MAR__INTERFACE__TCL__HXX
469 // EOF - interfaceTCL.hxx