]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/tcl/marTclInterface.h
62912066d8f21ec5fada4ba03815055e7fae4d04
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / tcl / marTclInterface.h
1 #ifndef MAR__INTERFACE__TCL__HXX
2 #define MAR__INTERFACE__TCL__HXX
3
4 #include "../kernel/marInterface.h"
5 #include <kgfo/volstat.hxx>
6 #include <tcl.h>
7 #include <tk.h>
8 #include <wx/list.h>
9 #include <wx/string.h>
10 #include <vtkCellArray.h>
11 #include <vtkCellLocator.h>
12 #include <vtkImageData.h>
13 #include <vtkMath.h>
14 #include <vtkPoints.h>
15 #include <vtkPolyData.h>
16 #include <vtkTclUtil.h>
17
18 // ----------------------------------------------------------------------------
19 static marInterface MyMaracasData;
20 static kVolume* _ucharVol = NULL;
21
22 // ----------------------------------------------------------------------------
23 void freeAllMaracasInterfaces_dll( )
24 {
25         MyMaracasData.reset( );
26         if( _ucharVol ) delete _ucharVol;
27         _ucharVol = NULL;
28 }
29
30 // ----------------------------------------------------------------------------
31 wxStringList params_dll( )
32 {
33     return( MyMaracasData._parameters->getRelationalArray( ) );
34
35 }
36
37 // ----------------------------------------------------------------------------
38 void setParams_dll( wxStringList& raParams )
39 {
40     MyMaracasData._parameters->setRelationalArray( raParams );
41
42 }
43
44 // ----------------------------------------------------------------------------
45 bool saveParams_dll( std::string& fName )
46 {
47     return( MyMaracasData.saveParameters( std::string( fName ) ) );
48
49 }
50
51 // ----------------------------------------------------------------------------
52 bool loadParams_dll( std::string& fName )
53 {
54     return( MyMaracasData.loadParameters( std::string( fName ) ) );
55
56 }
57
58 // ----------------------------------------------------------------------------
59 void SetROIStep_dll( double vWidth )
60 {
61     MyMaracasData._parameters->setROIStep( vWidth );
62
63 }
64
65 // ----------------------------------------------------------------------------
66 double GetActualVoxelSize_dll( ) {
67
68     return( MyMaracasData._parameters->getVoxelSize( ) );
69
70 }
71
72 // ----------------------------------------------------------------------------
73 wxStringList studies_dll( )
74 {
75     return( MyMaracasData._dicom->getStudies( ) );
76 }
77
78 // ----------------------------------------------------------------------------
79 wxStringList studyData_dll( std::string& study )
80 {
81     MyMaracasData._dicom->setActualStudy( study );
82     return( MyMaracasData._dicom->getRelationalArrayStudyData( ) );
83
84 }
85
86 // ----------------------------------------------------------------------------
87 wxStringList series_dll( std::string& study )
88 {
89     MyMaracasData._dicom->setActualStudy( study );
90     return( MyMaracasData._dicom->getSeries( ) );
91
92 }
93
94 // ----------------------------------------------------------------------------
95 wxStringList serieData_dll( std::string& study, std::string& serie )
96 {
97     MyMaracasData._dicom->setActualStudy( study );
98     MyMaracasData._dicom->setActualSerie( serie );
99     return( MyMaracasData._dicom->getRelationalArraySerieData( ) );
100
101 }
102
103 // ----------------------------------------------------------------------------
104 void SubtractSeries_dll( std::string& sl, std::string& sr, std::string& ss, std::string& description )
105 {/*
106    marDicom::SubtractSeries(
107    MyMaracasData._parameters,
108    MyMaracasData._dicom->getActualStudy( ),
109    sl, sr,
110    ss, description
111    );
112  */
113 }
114
115 // ----------------------------------------------------------------------------
116 bool LoadImages_dll( )
117 {
118     MyMaracasData._dicom->loadActualSerie( );
119     return( true );
120
121 }
122
123 // ----------------------------------------------------------------------------
124 void CastVolume_dummy( )
125 {
126         if( _ucharVol ) delete _ucharVol;
127         _ucharVol = new kVolume( *( MyMaracasData._dicom->getVolume( ) ) );
128
129         _ucharVol->convertScale( kVolume::UCHAR, 0, 255 );
130
131 }
132
133 // ----------------------------------------------------------------------------
134 void LoadTkImage_dummy( uchar** image, int w, int h,
135                                                 std::string& tkName, Tcl_Interp* interp )
136 {
137     Tk_PhotoHandle hnd;
138     Tk_PhotoImageBlock bl;
139
140     hnd = Tk_FindPhoto( interp, ( char* )tkName.c_str( ) );
141     if( hnd != NULL ) {
142
143         // Image size
144         bl.width  = w;
145         bl.height = h;
146
147         // One pixel is represented with one unsigned short value
148         bl.pixelSize = sizeof( uchar );
149
150         // We're working on intensity images i.e. no RGB
151         bl.offset[ 0 ] = 0;
152         bl.offset[ 1 ] = 0;
153         bl.offset[ 2 ] = 0;
154         bl.offset[ 3 ] = 0;
155
156         // To go to next in vertical value
157         bl.pitch = bl.pixelSize * bl.width;
158
159         // Menory block
160         bl.pixelPtr = ( uchar* )image[ 0 ];
161
162         // Ok, lets do it!
163         Tk_PhotoPutBlock( hnd, &bl, 0, 0, bl.width, bl.height );
164
165     } // fi
166
167 }
168
169 // ----------------------------------------------------------------------------
170 void LoadTkImages_dll( wxStringList& tkNames, Tcl_Interp* interp )
171 {
172     int k, w, h, d;
173         std::string tmp;
174
175     w = MyMaracasData._dicom->getVolume( )->getXdim( );
176     h = MyMaracasData._dicom->getVolume( )->getYdim( );
177     d = MyMaracasData._dicom->getVolume( )->getZdim( );
178
179     CastVolume_dummy( );
180         uchar*** vol = ( uchar*** )( _ucharVol->getData3D( ) );
181     for( k = 0; k < d; k++ ) {
182
183                 tmp = tkNames[ k ];
184         LoadTkImage_dummy( vol[ k ],
185                                                    w, h, tmp, interp );
186
187     } // rof
188
189 }
190
191 // ----------------------------------------------------------------------------
192 int GetNumberOfImages_dll( )
193 {
194     return( MyMaracasData._dicom->getVolume( )->getZdim( ) );
195
196 }
197
198 // ----------------------------------------------------------------------------
199 wxStringList GetImagesNumbers_dll( )
200 {
201     return( MyMaracasData._dicom->getImageNumbers( ) );
202
203 }
204
205 // ----------------------------------------------------------------------------
206 double GetImageIntensity_dll( int x, int y, int z )
207 {
208     return( MyMaracasData._dicom->getVolume( )->getPixel( x, y, z ) );
209
210 }
211
212 // ----------------------------------------------------------------------------
213 ushort* GetProfilFromTotalVolume_dll( int xO, int yO, int zO,
214                                                                                  int xF, int yF, int zF )
215 {
216     int i;
217         kVolumeStat* stats = new kVolumeStat( MyMaracasData._dicom->
218                                                                                   getVolume( ) );
219
220         stats->profile( xO, yO, zO, xF, yF, zF );
221
222     ushort* r = new ushort[ stats->getSize( ) + 6 ];
223
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 ];
232     return( r );
233
234 }
235
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,
240                                                                            int* sd, int* size )
241 {
242         kVolumeStat* stats = new kVolumeStat( MyMaracasData._dicom->getVolume( ) );
243
244         stats->stats( xO, yO, zO, xF, yF, zF );
245
246     *min = ( int )stats->getMin( );
247     *max = ( int )stats->getMax( );
248     *avg = ( int )stats->getAvg( );
249     *sd = ( int )stats->getSD( );
250     *size = stats->getSize( );
251
252 }
253
254 // ----------------------------------------------------------------------------
255 bool SaveExperiment_dll ( std::string& fName )
256 {
257     return( MyMaracasData.saveExperiment( fName ) );
258
259 }
260
261 // ----------------------------------------------------------------------------
262 bool LoadExperiment_dll ( std::string& fName )
263 {
264     return( MyMaracasData.loadExperiment( fName ) );
265
266 }
267
268 // ----------------------------------------------------------------------------
269 void InitExperiment_dll ( int* voi )
270 {
271     MyMaracasData._experiment->setVOI( voi );
272     MyMaracasData._experiment->initExperiment( MyMaracasData._dicom->
273                                                                                            getVolume( ) );
274         //if( _ucharVol ) delete _ucharVol;
275         //_ucharVol = NULL;
276         MyMaracasData._dicom->freeVolume( );
277 }
278
279 // ----------------------------------------------------------------------------
280 void SetStartPoint_dll( int x, int y, int z )
281 {
282     MyMaracasData._experiment->setStartPoint( x, y, z );
283 }
284
285 // ----------------------------------------------------------------------------
286 void ExtractAxes_dll( )
287 {
288     MyMaracasData._experiment->extractVascularTree( );
289 }
290
291 // ----------------------------------------------------------------------------
292 int GetNumberOfAxes_dll( )
293 {
294     return( MyMaracasData._experiment->getNumberOfAxes( ) );
295 }
296
297 // ----------------------------------------------------------------------------
298 vtkPolyData* GetAllAxes_dll( )
299 {
300     int i, n, j;
301     double p[ marAxis::INDX_count ];
302     marAxis* tmp;
303
304     vtkPoints* allPoints = vtkPoints::New( );
305     vtkCellArray* allTopology = vtkCellArray::New( );
306
307     j = 0;
308     for( n = 0; n < MyMaracasData._experiment->getNumberOfAxes( ); n++ ) {
309
310         tmp = MyMaracasData._experiment->getAxis( );
311         allTopology->InsertNextCell( tmp->getNumberOfControlPoints( ) );
312         for( i = 0; i < tmp->getNumberOfControlPoints( ); i++ ) {
313
314             tmp->getControlPoint( i, p, p + 3 );
315             allPoints->InsertNextPoint( p[ 0 ], p[ 1 ], p[ 2 ] );
316             allTopology->InsertCellPoint( j );
317                         j++;
318
319         } // rof
320
321     } // rof
322
323     vtkPolyData* allData = vtkPolyData::New( );
324     allData->SetPoints( allPoints );
325     allData->SetLines( allTopology );
326     
327     allPoints->Delete();
328     allTopology->Delete();
329
330     return( allData );
331
332 }
333
334 // ----------------------------------------------------------------------------
335 vtkPolyData* GetActualAxis_dll( )
336 {
337     int i, j, h;
338     double p[ marAxis::INDX_count ];
339     marAxis* tmp;
340
341     vtkPoints* points = vtkPoints::New( );
342     vtkCellArray* topology = vtkCellArray::New( );
343
344     j = 0;
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++ ) {
349
350                 tmp->getControlPoint( i, p, p + 3 );
351                 topology->InsertCellPoint( j++ );
352                 points->InsertNextPoint( p[ 0 ], h - 1 - p[ 1 ], p[ 2 ] );
353
354     } // rof
355
356     vtkPolyData* data = vtkPolyData::New( );
357     data->SetPoints( points );
358     data->SetLines( topology );
359     
360     points->Delete();
361     topology->Delete();
362
363     return( data );
364 }
365
366 // ----------------------------------------------------------------------------
367 int GetActualAxisNumberOfPoints_dll( )
368 {
369     return( MyMaracasData._experiment->getAxis( )->getNumberOfControlPoints( ) );
370
371 }
372
373 // ----------------------------------------------------------------------------
374 double* GetActualAxisPoint_dll( int i )
375 {
376     double* ret = new double[ marAxis::INDX_count + 1 ];
377
378     ret[ 0 ] = marAxis::INDX_count;
379     MyMaracasData._experiment->getAxis( )->getControlPoint( i, ret + 1, ret + 4 );
380     return( ret );
381 }
382
383 // ----------------------------------------------------------------------------
384 vtkImageData* GetActualAxisSlice_dll( int i )
385 {
386         //    return( MyMaracasData._experiment->GetSliceImage( i ) );
387         return( NULL );
388
389 }
390
391 // ----------------------------------------------------------------------------
392 void PrepareQuantification_dll( int i )
393 {
394         /*
395           MyMaracasData._experiment->SetAxis( i );
396           MyMaracasData._experiment->PrepareQuantification( );
397         */
398 }
399
400 // ----------------------------------------------------------------------------
401 double GetAxisLength_dll( )
402 {
403     return( MyMaracasData._experiment->getAxis( )->length( ) );
404
405 }
406
407 // ----------------------------------------------------------------------------
408 void GetImageRange_dll( int* min, int* max )
409 {
410     double m, M;
411
412     MyMaracasData._experiment->getDynData( )->getVolume( )->getMinMax( m, M );
413     *min = ( int )m;
414     *max = ( int )M;
415
416 }
417
418 // ----------------------------------------------------------------------------
419 vtkImageData* GetVTKVolume_dll( )
420 {
421     return( MyMaracasData._experiment->getDynData( )->getVolume( )->castVtk( ) );
422
423 }
424
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
431                                                   )
432 {
433     float a0[ 3 ], a1[ 3 ], x[ 3 ], t, pcoords[ 3 ];
434     int subId; 
435
436     int returnVal;
437  
438     iCellLocator->Update( );
439
440     a0[ 0 ] = x1; a0[ 1 ] = y1; a0[ 2 ] = z1;
441     a1[ 0 ] = x2; a1[ 1 ] = y2; a1[ 2 ] = z2;
442
443     returnVal = iCellLocator->IntersectWithLine( a0, a1, tol, t, x, pcoords, subId );
444     ( *xI ) = x[ 0 ]; ( *yI ) = x[ 1 ]; ( *zI ) = x[ 2 ];
445
446     return( returnVal );
447 }
448
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
454                                                    )
455 {
456     double x[ 3 ], y[ 3 ], z[ 3 ];
457     vtkMath* math;
458
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 ];
464     math->Delete( );
465 }
466
467 #endif // MAR__INTERFACE__TCL__HXX
468
469 // EOF - interfaceTCL.hxx