]> Creatis software - creaContours.git/blob - lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx
b95f0c460aacfaf6c93af09b9b4cb37202d5f07c
[creaContours.git] / lib / Interface_ManagerContour_NDimensions / wxContourMainFrame.cxx
1 //----------------------------------------------------------------------------------------------------------------
2 // Class definition include
3 //----------------------------------------------------------------------------------------------------------------
4 #include "wxContourMainFrame.h"
5
6
7
8 //----------------------------------------------------------------------------------------------------------------
9 // Includes
10 //----------------------------------------------------------------------------------------------------------------
11
12
13 #include "NameWrapper.h"
14 #include "wx/artprov.h"
15 #include "ConceptDataWrap.h"
16 #include <creaWx.h>
17
18 //----------------------------------------------------------------------------------------------------------------
19 // Class implementation
20 //----------------------------------------------------------------------------------------------------------------
21 /** @file wxContourMainFrame.cxx */
22
23         //------------------------------------------------------------------------------------------------------------
24         // Constructors & Destructors
25         //------------------------------------------------------------------------------------------------------------
26
27 wxContourMainFrame* wxContourMainFrame:: instance = NULL;
28 char wxContourMainFrame::COPY = 'C';
29                 
30         wxContourMainFrame :: wxContourMainFrame(wxWindow* parent, wxWindowID id,const wxString& title,const wxPoint& pos,const wxSize& size,long style)
31                 //: wxPanel(parent, id, title, pos, size, style)
32                 //: wxWindow(parent, id, pos, size, style)
33                 : wxPanel(parent, id, pos, size, style)
34         {
35                 m_mgr.SetManagedWindow(this);
36                 _creatingContoursActive         = false;
37                 _theViewPanel                           = NULL;
38 //              _modelManager                           = NULL;
39                 _instantPanel                           = NULL;
40 //              _buttonsBar                                     = NULL;
41 //              _gridPanel                                      = NULL; 
42 //              _drawToolsPanel                         = NULL;
43 //              _operationsToolsPanel           = NULL;
44                 //_autoFormsPanel                               = NULL; 
45 //              _standardToolsPanel                     = NULL;
46 //              _editionToolsPanel                      = NULL;
47 //              _listViewPanel                          = NULL;
48 //              _sceneManager                           = NULL;
49                 //_actualInstant                                = NULL;
50                 _numberOfVariablesStatistics = 6+1;
51
52                 _refLineControl                         = NULL;
53                 _refLineModel                           = NULL;
54                 _refLineView                            = NULL;
55                 _imageReslicer                          = NULL;
56                 _thresholdTable                         = NULL;
57                 _thresholdMapper                        = NULL;
58                 _thresholdActor                         = NULL;
59                 _actorPresent                           = false;
60
61                 // set up default notebook style
62 //              m_notebook_style =wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER;
63 //              m_notebook_theme = 0;   
64                 //wxContour_ActionCommandsID a;
65
66         }
67
68         wxContourMainFrame :: wxContourMainFrame(wxWindow* parent, wxWindowID id,const wxString& title,const wxPoint& pos,const wxSize& size,std::vector<vtkImageData*> images, long style,std::string datadir)         
69                 : wxPanel(parent, id, pos, size, style)
70         {
71                 m_mgr.SetManagedWindow(this);
72                 _creatingContoursActive         = false;
73                 _theViewPanel                           = NULL;
74
75                 _instantPanel                           = NULL;
76                 _refLineControl                         = NULL;
77                 _refLineModel                           = NULL;
78                 _refLineView                            = NULL;
79                 _imageReslicer                          = NULL;
80                 _thresholdTable                         = NULL;
81                 _thresholdMapper                        = NULL;
82                 _thresholdActor                         = NULL;
83                 _actorPresent                           = false;
84
85                 // set up default notebook style
86                 m_notebook_style =wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER;
87                 m_notebook_theme = 0;   
88                 //wxContour_ActionCommandsID a;
89                 _numberOfVariablesStatistics = 7;
90
91                 _datadir = datadir;
92
93         
94                 inredo = 0;
95                 inundo = 0;
96
97                 _pannew = interfMainPanel::getInstance(this,datadir+"/data/Icons");//, eventHandler);
98                 _performingOperation = new PerformingOperation();
99
100                 if(images.size() > 0)
101                 {
102                         _images = images;
103                         this->setVectImages(images);
104                 }
105
106 }
107
108 void wxContourMainFrame::setVectImages(std::vector<vtkImageData*> imgs)
109 {
110
111         #if defined(__GNUC__)
112                 std::string str_home(getenv("HOME"));
113         #elif defined(_WIN32)
114                         std::string str_home(getenv("USERPROFILE"));
115         #endif
116                 std::string strCreaContourDataTmp = str_home + "/.creaContourDataTemp/";
117
118         std::vector<std::string> conceptNameVect;
119         std::vector<int> conceptSizeVect;
120
121         notebook = this->createNotebook();              
122
123
124         kernelManager = new KernelManagerContour( imgs , _datadir+"/data/" , strCreaContourDataTmp );
125
126
127         _instantPanel                           = new wxInstantChooserPanel( notebook, "Instant Chooser", true, false, "c" );
128         _theViewPanel                           = new wxContourViewPanel( kernelManager->getSourceImage(), notebook );  
129                 
130 //-------------------------------------------------------------
131         kernelManager->getConceptsInformation(conceptNameVect, conceptSizeVect);
132         _instantPanel->addConcepts(conceptNameVect, conceptSizeVect);
133                 
134
135         double val = _theViewPanel->getCurrentDeep();
136         _instantPanel->setConceptValue( "Axe Depth", (int)val );
137         //JCP _instantPanel->setConceptValue("time", num de imagenes);
138         ConceptDataWrap * data = _instantPanel->getConceptDataOf( "Axe Depth" );
139         //*******************changeInstant();
140         _theViewPanel->setVerticalConcept( "Axe Depth", data->getMinValue(), data->getMaxValue(), data->getMinShowedValue(),  data->getMaxShowedValue(), data->getActualValue() );
141
142         this->configurePanels( );
143
144 }
145
146
147         wxContourMainFrame* wxContourMainFrame :: getInstance(wxWindow* parent, wxWindowID id,const wxString& title,const wxPoint& pos,const wxSize& size,std::vector<vtkImageData*> images, long style,std::string datadir ){
148                 if(instance == NULL){
149                         instance = new wxContourMainFrame(parent, id, title, pos, size, images, style,datadir);
150                 }
151                 return instance;
152         }
153
154         std::vector<vtkImageData*> wxContourMainFrame ::getVectImages()
155         {
156                 return kernelManager->getVectImages();
157         }
158
159         wxContourMainFrame* wxContourMainFrame :: getInstance()
160         {
161                 return instance;        
162         }
163
164         void wxContourMainFrame :: resetInstance()
165         {
166                 instance->Destroy();
167         }
168
169         wxContourMainFrame :: ~wxContourMainFrame()
170         {
171                 deleteAllContours();
172                 _pannew->Close();
173                 interfMainPanel::resetInstance();
174                 delete kernelManager;
175                 instance = NULL;
176                 //_pannew->Destroy();
177                 //delete _pannew;
178
179                 m_mgr.UnInit();
180                 //delete m_mgr;
181
182                 //El problema al cerrar la aplicacion puede estar asociado 
183                 //a que  wxAUINotebook esta en la aplicacion 
184                 //principal (wxContourGUIExample)tambien
185                 //EED????               delete _theViewPanel;             
186                 //EED????               delete _instantPanel;
187                 //EED????               delete _buttonsBar;
188                 //EED????               delete _actualInstant;           
189                 //EED????               delete _sceneManager;
190         }
191
192
193         //------------------------------------------------------------------------------------------------------------
194         // Creational and initialization methods using WxAui
195         //------------------------------------------------------------------------------------------------------------
196         //
197         wxAuiNotebook * wxContourMainFrame :: createNotebook()
198         {
199                 wxSize client_size = GetClientSize();
200                 wxAuiNotebook* noteBook = new wxAuiNotebook(this, -1, wxPoint(client_size.x, client_size.y), wxSize(430,200), m_notebook_style);
201                 wxBitmap page_bmp = wxArtProvider::GetBitmap(wxART_NORMAL_FILE, wxART_OTHER, wxSize(16,16));
202                 return noteBook;
203         }
204         
205
206         //------------------------------------------------------------------------------------------------------------
207         // Creational and initialization methods 
208         //------------------------------------------------------------------------------------------------------------
209         bool wxContourMainFrame :: configurePanels( )
210         {
211                 bool configured = _theViewPanel!=NULL;
212                                         
213                 configured &= _theViewPanel!=NULL;
214                 if( _theViewPanel!=NULL )
215                 {
216                         notebook->AddPage( _theViewPanel, wxT("       View       ") );          
217                         m_mgr.Update();
218                 }
219
220
221                 if( configured )
222                 {
223                         notebook->AddPage( _instantPanel, wxT("Instant Page") );
224                         m_mgr.Update();
225                 }
226
227                 m_mgr.AddPane(notebook, wxAuiPaneInfo().Name(wxT("notebook_content")).CenterPane().PaneBorder(false));
228                 m_mgr.Update();
229                  
230                 SetMinSize(wxSize(300,300));
231                 m_mgr.Update();
232                 return configured;
233         }
234
235
236         bool wxContourMainFrame::addNewPanel(wxPanel* panel)
237                 {
238                 bool configured = panel!=NULL;
239                 configured &= panel!=NULL;
240                 
241                 if( configured )
242                 {
243                         notebook->AddPage( panel, wxT("       Viewer       "), true );
244                         m_mgr.Update();
245                 }
246                 return configured;
247         }
248
249         //------------------------------------------------------------------------------------------------------------
250         //  Attributes getters and setters
251         //------------------------------------------------------------------------------------------------------------
252         
253
254         
255         void wxContourMainFrame :: setInstantChooserPanel(  wxInstantChooserPanel * theInstantChooserPanel )
256         {
257                 _instantPanel = theInstantChooserPanel; 
258         }
259
260 //      void wxContourMainFrame :: setButtonsBar(  wxContour_ButtonsBar * theButtonsBar )
261 //      {
262 //              _buttonsBar = theButtonsBar;
263 //      }
264
265 //      void wxContourMainFrame :: setGrid(  wxContour_Grid * theGridPanel )
266 //      {
267 //              _gridPanel = theGridPanel;
268 //      }
269
270 //      void wxContourMainFrame :: setDrawToolsPanel(  wxContour_DrawToolsPanel * theDrawToolsPanel )
271 //      {
272 //              _drawToolsPanel = theDrawToolsPanel;
273 //      }
274
275 //      void wxContourMainFrame :: setOperationsToolsPanel(  wxContour_OperationsToolsPanel * theOperationsToolsPanel )
276 //      {       
277 //              _operationsToolsPanel = theOperationsToolsPanel;
278 //      }
279
280 //      void wxContourMainFrame :: setAutomaticFormsPanel(  wxContour_AutomaticFormsToolsPanel * theAutoFormsPanel )
281 //      {
282 //              _autoFormsPanel = theAutoFormsPanel;
283 //      }
284
285 //      void wxContourMainFrame :: setStandardToolsPanel(  wxContour_StandardToolsPanel * theStandardToolsPanel )
286 //      {
287 //              _standardToolsPanel= theStandardToolsPanel;
288 //      }
289
290 //      void wxContourMainFrame :: setEditionToolsPanel(  wxContour_EdtionToolsPanel * theEditionToolsPanel )
291 //      {
292 //              _editionToolsPanel =  theEditionToolsPanel;
293 //      }
294
295 //      void wxContourMainFrame :: setListViewPanel(  wxContour_ListViewPanel * theListViewPanel )
296 //      {
297 //              _listViewPanel = theListViewPanel;
298 //      }
299
300
301
302 void wxContourMainFrame::onCreateContourSpline( ){
303         
304         //JCP 20-10-08 Undo redo implementation
305         saveState();
306         //JCP 20-10-08 Undo redo implementation
307         createContour( 1 );
308         
309 }
310 void wxContourMainFrame::onCreateContourRectangle( ){
311     //JCP 20-10-08 Undo redo implementation
312         saveState();
313         //JCP 20-10-08 Undo redo implementation 
314         createContour( 2 );
315 }
316 void wxContourMainFrame::onCreateContourCircle( ){
317     //JCP 20-10-08 Undo redo implementation
318         saveState();
319         //JCP 20-10-08 Undo redo implementation 
320         createContour( 3 );
321 }
322
323 void wxContourMainFrame::onCreateContourLine( ){
324     //JCP 20-10-08 Undo redo implementation
325         saveState();
326         //JCP 20-10-08 Undo redo implementation 
327         createContour( 6 );
328 }
329
330 //------------------------------------------------------------------------------------------------------------
331
332 void wxContourMainFrame :: onCreateContourBullEye(wxPanel* panel )
333 {
334         //Creating the manualContourModel and including in the model
335         manualContourModel * manModelContour = factoryManualContourModel(panel );
336
337         std::vector<int> instantVector;
338         _instantPanel->getInstant( instantVector );
339         std::string theName = kernelManager->createOutline(manModelContour, instantVector);
340         
341         /*std::vector<int> instantVector;
342         _instantPanel->getInstant( instantVector );
343         std::string theName;
344         theName= _modelManager->createOutline( manModelContour, instantVector );*/
345         bool addedModel = theName.compare("") != 0;//??
346
347         if( addedModel )
348         {
349                 double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
350                 _theViewPanel->getSpacing(spc);                                 
351                 //Adding the manualContourControler to interface objects structure
352                 //Adding the manualViewContour to interface objects structure           
353                 //_theViewPanel->getSceneManager()->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
354                 _theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc , 4) ;
355         }
356 }
357 void wxContourMainFrame :: createContour( int typeContour )
358 {
359         //Creating the manualContourModel and including in the model
360         manualContourModel * manModelContour = kernelManager->factoryManualContourModel(typeContour);
361
362
363         std::vector<int> instantVector;
364         _instantPanel->getInstant( instantVector );
365         std::string theName = kernelManager->createOutline(manModelContour, instantVector);
366         
367         /*std::vector<int> instantVector;
368         _instantPanel->getInstant( instantVector );
369         std::string theName;
370         theName= _modelManager->createOutline( manModelContour, instantVector );*/
371         bool addedModel = theName.compare("") != 0;//??
372         if( addedModel )
373         {
374                 double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
375                 _theViewPanel->getSpacing(spc);                                 
376                 //Adding the manualContourControler to interface objects structure
377                 //Adding the manualViewContour to interface objects structure           
378                 //_sceneManager->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
379                 _theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc , typeContour) ;
380         }       
381
382 }
383 manualContourModel * wxContourMainFrame::factoryManualContourModel(wxPanel* panel){
384
385         manualContourModelBullEye *manModelContourBullEye = new manualContourModelBullEye();
386         manualContourModel *manModelContour=NULL;
387         manModelContour = manModelContourBullEye;
388         if (panel!=NULL){
389                 int iCrown,sizeCrowns,iSector,sizeSectors;
390                 double radioA,radioB,ang,angDelta ;
391                 sizeCrowns = ((PanelBullEyeOptions*)panel)->GetNumberOfCrowns();
392                 for ( iCrown=0 ; iCrown<sizeCrowns ; iCrown++ )
393                 {
394                         sizeSectors = ((PanelBullEyeOptions*)panel)->GetNumberOfSections(iCrown);
395                         radioB  = ((PanelBullEyeOptions*)panel)->GetRadioOfCrown(iCrown);
396                         if (iCrown==sizeCrowns-1)
397                         {
398                                 radioA  = 0;
399                         } else {
400                                 radioA  = ((PanelBullEyeOptions*)panel)->GetRadioOfCrown(iCrown+1);
401                         }
402                         radioA=radioA/100.0;
403                         radioB=radioB/100.0;
404                         for ( iSector=0 ; iSector<sizeSectors  ; iSector++ )
405                         {
406                                 ang             = ((PanelBullEyeOptions*)panel)->GetAngOfCrownSection(iCrown,iSector);
407                                 angDelta= ((PanelBullEyeOptions*)panel)->GetAngDeltaOfCrownSection(iCrown);                                     
408                                 manModelContourBullEye->AddSector(radioA,radioB,ang,angDelta);
409                         } // for iSector
410                 } // for iCrown
411         } // if _panelBullEyeOptions
412         
413         return manModelContour;
414 }
415 void wxContourMainFrame :: saveState(){ 
416                 
417         std::string temp = kernelManager->saveState();
418         saveFileWithContours(temp);     
419 }
420
421 void wxContourMainFrame::onDeleteContour(){
422         //JCP 20-10-08 Undo redo implementation
423                 saveState();
424                 //JCP 20-10-08 Undo redo implementation
425
426                 std::vector<std::string> lstKeyNameToBeErase;
427                 lstKeyNameToBeErase             = _theViewPanel->getSceneManager()->getSelectedObjects();
428                 deleteContours( lstKeyNameToBeErase );
429 /*JCP 19 - 11 - 08
430                 int i,size=_sceneManager->getSelectedObjects().size();
431                 for(i=0;i<size;i++)
432                 {
433                         std::string keyName             = _sceneManager->getSelectedObjects()[i];
434                         int ispartofstaticlist  = this->_modelManager->IsPartOfStaticList( keyName );
435                         if ( ispartofstaticlist>=0 )
436                         {
437                                 std::vector<int> tempVector;
438                                 _instantPanel->getInstant( tempVector );
439                                 Instant instant(&tempVector);
440                                 this->_modelManager->ChangeContourOfList(keyName, &instant);
441                         }
442                 }
443
444                 std::vector<std::string> lstKeyName;
445                 std::vector<std::string> lstKeyNameActualSlice;
446                 std::vector<std::string> lstKeyNameToBeErase;
447
448                 lstKeyNameToBeErase             = _sceneManager->getSelectedObjects();
449                 lstKeyNameActualSlice   = _sceneManager->GetlstContoursNameActualSlice();
450                 int k,kSize=lstKeyNameToBeErase.size();
451                 int j,jSize=lstKeyNameActualSlice.size();
452                 bool ok;
453                 for (k=0;k<kSize; k++)
454                 {
455                         ok=false;
456                         for (j=0;j<jSize; j++)
457                         {
458                                 if (lstKeyNameToBeErase[k]==lstKeyNameActualSlice[j])
459                                 { 
460                                         ok=true;
461                                 }
462                         } // for j
463                         if (ok==true)
464                         {
465                                 lstKeyName.push_back( lstKeyNameToBeErase[k] );
466                         } // if ok
467                 } // for k
468
469                 deleteContours( lstKeyName );
470 JCP 19 - 11 - 08*/
471 }
472
473 void wxContourMainFrame :: deleteContours( std::vector<std::string>  keyNamesVector )
474 {
475         int i,size=keyNamesVector.size();
476         for (i=0;i<size;i++)
477         {
478                 deleteContour( keyNamesVector[i] );
479         }
480 }
481
482 void wxContourMainFrame :: deleteContour( std::string theKeyName ){
483         /*
484         manualContourModel                      * cModel;
485         manualViewBaseContour           * cViewer;
486         manualContourBaseControler      * cControler;
487
488         ContourWrap_ViewControl *conwrapviewControl =  _theViewPanel->getSceneManager()->getContourWrap_ViewControlOf( theKeyName );
489         cControler      = conwrapviewControl->getControler();*/
490
491         //JCP 21 - 11 - 2008
492         bool isedit = _theViewPanel->isEditableCControler(theKeyName);
493         bool ispartofstaticlst = kernelManager->IsPartOfStaticList(theKeyName);
494
495         if (isedit  && ispartofstaticlst)
496         {
497                 _theViewPanel->removeFromScene(theKeyName);
498
499                 kernelManager->deleteCModel(theKeyName);
500                 //_theViewPanel->getSceneManager()->removeFromScene( theKeyName );                      
501                 //cViewer               = conwrapviewControl->getViewer();
502                 //_theViewPanel->getSceneManager()->removeWrap( theKeyName );
503                 //cControler* conwrapviewControl->getControler();                       
504 //EED Borrame
505 //FILE *ff = fopen("c:/temp/wxVtkBaseView_SceneManagerStadistics.txt","a+");
506 //fprintf(ff,"EED wxContourEventHandler::deleteContours() \n" );
507 //fprintf(ff,"    %s %p\n",keyNamesVector[i].c_str(),  cControler );
508 //fclose(ff);
509         //      delete cModel;
510         //      delete cViewer;
511         //      delete cControler;
512         } // if editable
513 //JCP 21 - 11 - 08
514 }
515
516 void wxContourMainFrame::onDeleteContoursActSlice(){
517         //JCP 20-10-08 Undo redo implementation
518         saveState();
519         //JCP 20-10-08 Undo redo implementation
520         deleteContours( (std::vector<std::string>)_theViewPanel->getSceneManager()->GetlstContoursNameActualSlice() );
521 }
522 void wxContourMainFrame::onDeleteAllContours(){
523         //JCP 20-10-08 Undo redo implementation
524         saveState();
525         deleteAllContours();
526 }
527 void wxContourMainFrame::deleteAllContours(){
528         //JCP 20-10-08 Undo redo implementation
529
530         wxBusyCursor wait;
531         std::vector<int> tempVector;
532         _instantPanel->getInstant( tempVector );
533
534 //JCP --08-09-2008 When using a diferent interface the _mbarrangeDeleteAll might not be initialize
535 //              the values in GetStart and GetEnd will then not be initialize also.
536 //              We use instead the values given when initializing the _deletepanel.
537
538         //int minZ = _mbarrangeDeleteAll->GetStart();
539         //int maxZ = _mbarrangeDeleteAll->GetEnd();
540         int minZ, maxZ;
541         
542         minZ = 0;
543         maxZ = _theViewPanel->getSceneManager()->GetImageDataSizeZ();
544         
545 //JCP --08-09-2008
546         
547         _theViewPanel->getSceneManager()->removeSceneContours( );       
548         _theViewPanel->getSceneManager()->removeAllOutlines();
549         kernelManager->removeAllOutlines();     
550 //JCP --08-09-2008
551         /*
552         if ( (minZ==0) && (maxZ==_mbarrangeDeleteAll->GetMax() ))
553         {
554                 _theViewPanel->getSceneManager()->removeSceneContours( );
555                 _modelManager->removeAllOutlines();
556                 _theViewPanel->getSceneManager()->removeAllOutlines();
557
558         } else {
559                 for ( z=minZ ; z<=maxZ ; z++)
560                 {
561                         tempVector[1]=z;
562                         Instant instant(&tempVector);
563                         std::vector<ContourThing**> lstContourThings = this->_modelManager->getOutlinesAtInstant( &instant );
564
565                         sizeLstContourThings = lstContourThings.size();
566                         for (ii=0 ; ii<sizeLstContourThings ; ii++)
567                         {
568                                 ContourThing **contourthing = lstContourThings[ii];
569                                 deleteContour( (*contourthing)->getName() );
570                         } //for ii
571                 }// for z
572         } // if 
573 JCP --08-09-2008 */
574 }
575
576 void wxContourMainFrame::setConceptValue( std::string name, int value ){
577         _instantPanel->setConceptValue(name, value);
578 }
579
580 ConceptDataWrap* wxContourMainFrame::getLastConceptData(){
581         return _instantPanel->getLastConceptData();
582 }
583 bool wxContourMainFrame::getIfConceptCheckedAt( std::string name, int pos ){
584         return _instantPanel->getIfConceptCheckedAt( name, pos );
585 }
586
587 void wxContourMainFrame::changeInstant()
588 {
589                 std::vector<int> instantVect;
590                 _instantPanel->getInstant( instantVect );
591 //              Instant * theInstant = new Instant ( &instantVect );
592                 
593                 //Setting the actual instant
594                 //_actualInstant = theInstant;
595
596                 kernelManager->setInstant(instantVect);
597                 //_modelManager->setInstant( _actualInstant );
598                 
599             onThresholdChange();
600                 updateInstantOutlines();
601                 updateInstantImageData();
602                 updateInstantAxes();
603 }
604
605
606 void wxContourMainFrame :: updateInstantOutlines()
607 {
608         _theViewPanel->removeSceneContours();
609         _theViewPanel->addNameWrapperToScene();
610
611         //for( int i=0; i<size; i++)
612         //{                     
613         //      _theViewPanel->getSceneManager()->addToScene(namesWrapping[i]->getKeyName(), true, true, true, false, false );
614         //}
615 }
616
617 int wxContourMainFrame::getNamesWrappingSize(){
618         return kernelManager->getNamesWrappingSize();
619 }
620 std::string wxContourMainFrame::getNameWrapping(int i){
621         return kernelManager->getNameWrapping(i);
622 }
623
624 void wxContourMainFrame::updateInstantImageData()
625 {
626         std::vector<int> inst;
627         _instantPanel->getInstant(inst);
628
629         vtkImageData* img = kernelManager->getImageAtInstant(inst);
630         if(img!=NULL){
631                 _theViewPanel->changeImage(img);
632                 showAxis(false);
633         }else{
634                 int z = _instantPanel->getConceptDataOf("Axe Depth")->getActualValue();
635                 _theViewPanel->setImageSlice(z);
636         }
637 }
638
639 void wxContourMainFrame::updateInstantAxes()
640 {
641 }
642
643
644 void wxContourMainFrame::onChangeDeep(int val){
645         _instantPanel->setConceptValue( "Axe Depth", (int)val );        
646         changeInstant();
647 }
648
649
650 void wxContourMainFrame::onCopy(){
651         std::vector<std::string> currentSelection = _theViewPanel->getSelectedObjects();
652
653         std::vector<int> tempVector;
654         _instantPanel->getInstant( tempVector );
655     _performingOperation->reset();
656         _performingOperation->setStartCommand( COPY );
657         _performingOperation->setStartOperationInstantVector( tempVector );
658         _performingOperation->setKeyNamesOperationElems( currentSelection );
659 }
660
661 void wxContourMainFrame::onPaste(){
662
663
664         char theStartCommand = _performingOperation->getStartCommand();
665         if (  theStartCommand == COPY )
666         {
667                 //JCP 20-10-08 Undo redo implementation
668                 saveState();
669                 //JCP 20-10-08 Undo redo implementation
670                 std::vector<int> tempVector;
671                 _instantPanel->getInstant( tempVector );
672                 _performingOperation->setEndOperationInstantVector ( tempVector );
673                 std::vector<std::string> elems = _performingOperation->getKeyNamesOperationElems();
674                 int i,size = elems.size();                      
675                 for( i=0; i<size; i++ )
676                 {                               
677                         createCopyContourOf( elems[i], tempVector, i>0 );
678                 }               
679         }
680 }
681 void wxContourMainFrame::onUndo(){
682         std::string filename;
683         if(kernelManager->onUndoSaveFile(filename)){
684                 saveFileWithContours(filename);
685         }
686         if(kernelManager->onUndo(filename)){
687                 loadState(filename);
688         }
689 }
690 void wxContourMainFrame::onRedo(){
691         std::string filename;
692         if(kernelManager->onRedo(filename)){
693                 loadState(filename);
694         }
695         
696 }
697 void wxContourMainFrame :: createCopyContourOf ( std::string anExistingKName, std::vector<int> &instantNoTouchData, bool append )
698 {
699         std::string cloneName = kernelManager->createCopyContourOf( anExistingKName, instantNoTouchData );
700         manualContourModel * manualModel = kernelManager->getOutlineByKeyName(cloneName);//_modelManager->getOutlineByKeyName( cloneName )->getModel();
701         _theViewPanel->getSceneManager()->createCopyContourOf( anExistingKName, cloneName, manualModel , append );
702 }
703
704 ///AD: 03-09    Copy the object and apply the given transformation
705 void wxContourMainFrame :: createMirrorContourOf ( std::string anExistingKName, std::vector<int> &instantNoTouchData, bool append )
706 {
707         std::string cloneName = kernelManager->createCopyContourOf( anExistingKName, instantNoTouchData );
708         manualContourModel * manualModel = kernelManager->getOutlineByKeyName(cloneName);
709
710         manualPoint * refPoint1 = _refLineModel->GetManualPoint(0);
711         manualPoint * refPoint2 = _refLineModel->GetManualPoint(1);
712
713         double pnt1X = refPoint1->GetX();
714         double pnt1Y = refPoint1->GetY();
715 //      double pnt1Z = refPoint1->GetZ();
716         double pnt2X = refPoint2->GetX();
717         double pnt2Y = refPoint2->GetY();
718 //      double pnt2Z = refPoint2->GetZ();
719
720         double angle = (atan2(pnt2Y - pnt1Y, pnt2X - pnt1X) * 180 / 3.1415926535897932384626433832795)+90;
721         vtkTransform *t = vtkTransform::New();
722
723         t->PostMultiply();
724         t->Identity();
725         t->Translate(-pnt1X, -pnt1Y, 0);
726         t->RotateZ(-angle);
727         t->Scale(-1,1,1);
728         t->RotateZ(angle);
729         t->Translate(pnt1X, pnt1Y, 0);
730         t->Update();
731
732         int i,size=manualModel->GetSizeLstPoints();
733         for (i=0;i<size;i++)
734         {
735                 manualPoint * mp = manualModel->GetManualPoint(i);
736                 float vecIn[3];
737                 float vecOut[3];
738                 vecIn[0]=mp->GetX();
739                 vecIn[1]=mp->GetY();
740                 vecIn[2]=mp->GetZ();
741                 t->TransformPoint( vecIn, vecOut );
742                 mp->SetPointX( vecOut[0] );
743                 mp->SetPointY( vecOut[1] );
744                 mp->SetPointZ( vecOut[2] );
745         }
746
747         _theViewPanel->getSceneManager()->createCopyContourOf( anExistingKName, cloneName, manualModel , append );
748 }
749
750 void wxContourMainFrame ::loadState(std::string filename){
751         char tmp[255];
752         FILE *pFile=fopen(filename.c_str(),"r+");
753
754         fscanf(pFile,"%s",tmp); // --CreaContour--
755
756         fscanf(pFile,"%s",tmp); // Version
757         fscanf(pFile,"%s",tmp); // 1.0.2 || 1.0.1 || 1.0.0
758         std::string version(tmp);
759
760         deleteAllContours();
761
762         //AD:02-06-09
763         if (version=="1.0.2")
764         {
765                 loadContours(pFile);
766         }
767         
768         //AD:02-06-09
769         else if (version=="1.0.1")
770         {
771                 loadContours(pFile);
772         }
773         
774         //AD:02-06-09
775         else if (version=="1.0.0")
776         {
777                 loadContours(pFile);
778         }
779
780         fclose(pFile);
781 }
782
783 void wxContourMainFrame ::loadContours( FILE *pFile )
784 {
785         char tmp[255];
786         fscanf(pFile,"%s",tmp); // NumberOfContours 
787         fscanf(pFile,"%s",tmp); // ##
788         int numberOfContours = atoi(tmp);  
789
790         std::vector<int> instantVector;
791         int typeContourModel;
792         manualContourModel *manModelContour;
793         int typeView;
794         
795         fscanf(pFile,"%s",tmp); // ImageDimensions
796         fscanf(pFile,"%s",tmp); // X
797         fscanf(pFile,"%s",tmp); // Y
798         fscanf(pFile,"%s",tmp); // Z
799
800         fscanf(pFile,"%s",tmp); // ImageSpacing
801         fscanf(pFile,"%s",tmp); // X
802         fscanf(pFile,"%s",tmp); // Y
803         fscanf(pFile,"%s",tmp); // Z
804
805         int i;
806         for (i=0;i<numberOfContours;i++)
807         {
808                 instantVector.clear();
809                 fscanf(pFile,"%s",tmp); // Instant
810                 fscanf(pFile,"%s",tmp); // 1
811                 instantVector.push_back( atoi(tmp) );
812                 fscanf(pFile,"%s",tmp); // 2
813                 instantVector.push_back( atoi(tmp) );
814                 fscanf(pFile,"%s",tmp); // 3
815                 instantVector.push_back( atoi(tmp) );
816                 fscanf(pFile,"%s",tmp); // 4
817                 instantVector.push_back( atoi(tmp) );
818                 fscanf(pFile,"%s",tmp); // 5
819                 instantVector.push_back( atoi(tmp) );
820                 fscanf(pFile,"%s",tmp); // 6
821                 instantVector.push_back( atoi(tmp) );
822
823                 fscanf(pFile,"%s",tmp); // TypeContourModel
824                 fscanf(pFile,"%s",tmp); // ##
825                 typeContourModel = atoi(tmp);
826
827                 manModelContour =  kernelManager->factoryManualContourModel(typeContourModel);
828                 manModelContour->Open(pFile);
829
830                 fscanf(pFile,"%s",tmp); // TypeView
831                 fscanf(pFile,"%s",tmp); // ##
832                 typeView = atoi(tmp);  
833
834                 std::string theName;
835                 theName = kernelManager->createOutline( manModelContour, instantVector );
836                 bool addedModel = theName.compare("") != 0;
837                 if( addedModel )
838                 {
839                         double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
840                         _theViewPanel->getSpacing(spc);                                 
841                         //Adding the manualContourControler to interface objects structure
842                         //Adding the manualViewContour to interface objects structure           
843                         //_theViewPanel->getSceneManager()->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
844                         _theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc , typeView) ;
845                 }       
846         }// for  numberOfContours
847 }
848
849 void wxContourMainFrame::onLoad()
850 {
851         char tmp[255];
852         wxFileDialog dialog(NULL, _T("Choose a file"), _T(""), _T(""), _T("*.roi"), wxOPEN );
853         if (dialog.ShowModal() == wxID_OK)
854         {
855                 std::string fileNameContourROI = (const char *)(dialog.GetPath().mb_str());
856                 FILE *pFile=fopen(fileNameContourROI.c_str(),"r+");
857
858                 fscanf(pFile,"%s",tmp); // --CreaContour--
859
860                 fscanf(pFile,"%s",tmp); // Version
861                 fscanf(pFile,"%s",tmp); // 1.0.2 || 1.0.1 || 1.0.0
862                 std::string version(tmp);
863                 
864                 //AD:02-06-09
865                 if (version=="1.0.2")
866                 {
867                         openContours(pFile,2);
868                 }
869                 
870                 //AD:02-06-09
871                 else if (version=="1.0.1")
872                 {
873                         openContours(pFile,1);
874                 }
875                 
876                 //AD:02-06-09
877                 else if (version=="1.0.0")
878                 {
879                         openContours(pFile,0);
880                 }
881
882                 fclose(pFile);
883         }
884         _theViewPanel->getSceneManager()->removeSceneContours();
885         changeInstant();
886 }
887
888 //AD: 29-05-09
889 void wxContourMainFrame::onSave(){
890         wxFileDialog dialog(NULL, _T("Choose a file"), _T(""), _T(""), _T("*.roi"), wxSAVE );
891         if (dialog.ShowModal() == wxID_OK)
892         {
893                 std::string fileNameContourROI = (const char *)(dialog.GetPath().mb_str());
894                 kernelManager->setCurrentFileName(fileNameContourROI);
895                 saveFileWithContours( fileNameContourROI );
896         }
897 }
898
899 //AD: 29-05-09
900 void wxContourMainFrame::saveFileWithContours( std::string filename )
901 {
902
903         FILE *pFile=fopen(filename.c_str(),"w+");
904         std::vector< std::string > lstNameThings;
905         int i,sizeLstNameThings; 
906
907         fprintf(pFile,"--CreaContour--\n");
908         fprintf(pFile,"Version %s\n", "1.0.2" );
909
910         // Normal Contours
911         lstNameThings           = kernelManager->GetLstNameThings();
912         sizeLstNameThings       = lstNameThings.size(); 
913         fprintf(pFile,"NumberOfContours %d\n", sizeLstNameThings );
914
915         vtkImageData *image = _images[0];
916
917         int dimRange[3];
918         image->GetDimensions(dimRange);
919
920         fprintf(pFile,"ImageDimensions %d %d %d\n", dimRange[0], dimRange[1], dimRange[2] );
921
922         double spaRange[3];
923         image->GetSpacing(spaRange);
924
925         fprintf(pFile,"ImageSpacing %f %f %f\n", spaRange[0], spaRange[1], spaRange[2] );
926
927         for (i=0 ; i<sizeLstNameThings ; i++) 
928         {
929                 kernelManager->SaveThingName( pFile, lstNameThings[i] );
930                 _theViewPanel->getSceneManager()->SaveThingName( pFile, lstNameThings[i] );
931         }// for i
932
933         //-- Contours Statics 
934         lstNameThings           = kernelManager->GetLstNameThingsStatic();
935         sizeLstNameThings       = lstNameThings.size(); 
936         fprintf(pFile,"NumberOfContoursStatic %d\n", sizeLstNameThings );
937         for (i=0 ; i<sizeLstNameThings ; i++) 
938         {
939                 kernelManager->SaveThingName( pFile, lstNameThings[i] );
940                 _theViewPanel->getSceneManager()->SaveThingName( pFile, lstNameThings[i] );
941         }// for i
942         fclose(pFile);
943 }
944
945 //AD:04-06-09
946 void wxContourMainFrame::openContours( FILE *pFile, int version )
947 {
948         char tmp[255];
949         fscanf(pFile,"%s",tmp); // NumberOfContours 
950         fscanf(pFile,"%s",tmp); // ##
951         int numberOfContours = atoi(tmp);  
952
953         std::vector<int> instantVector;
954         int typeContourModel;
955         manualContourModel *manModelContour;
956         int typeView;
957
958         vtkImageData *image = _images[0];
959         int imageDim[3];
960         double imageSpac[3];
961         int tempDim[3];
962         double tempSpac[3];
963         
964         bool compatible = true;
965         
966         //Version==2    
967         if (version==2)
968         {
969                 image->GetDimensions(imageDim);
970                 image->GetSpacing(imageSpac);
971
972                 fscanf(pFile,"%s",tmp); // ImageDimensions
973                 fscanf(pFile,"%s",tmp); // X
974                 tempDim[0] = atoi(tmp);
975                 fscanf(pFile,"%s",tmp); // Y
976                 tempDim[1] = atoi(tmp);
977                 fscanf(pFile,"%s",tmp); // Z
978                 tempDim[2] = atoi(tmp);
979
980                 fscanf(pFile,"%s",tmp); // ImageSpacing
981                 fscanf(pFile,"%s",tmp); // X
982                 tempSpac[0] = atof(tmp);
983                 fscanf(pFile,"%s",tmp); // Y
984                 tempSpac[1] = atof(tmp);
985                 fscanf(pFile,"%s",tmp); // Z
986                 tempSpac[2] = atof(tmp);
987                 
988                 //Compare Spacing and Dims in X and Y (Necessary in Z?) - Just for Version 3
989                 if (imageDim[0]!=tempDim[0] || imageDim[1]!=tempDim[1] || imageSpac[0]!=tempSpac[0] || imageSpac[1]!=tempSpac[1])
990                 {
991                         compatible = false;
992                 }
993         }
994
995         if (compatible==true)
996         {
997                 int i;
998                 for (i=0;i<numberOfContours;i++)
999                 {
1000                         instantVector.clear();
1001                         fscanf(pFile,"%s",tmp); // Instant
1002
1003                         fscanf(pFile,"%s",tmp); // 1
1004                         instantVector.push_back( atoi(tmp) );
1005                         fscanf(pFile,"%s",tmp); // 2
1006                         instantVector.push_back( atoi(tmp) );
1007                         fscanf(pFile,"%s",tmp); // 3
1008                         instantVector.push_back( atoi(tmp) );
1009                         fscanf(pFile,"%s",tmp); // 4
1010                         instantVector.push_back( atoi(tmp) );
1011                         fscanf(pFile,"%s",tmp); // 5
1012                         instantVector.push_back( atoi(tmp) );
1013                         fscanf(pFile,"%s",tmp); // 6
1014                         instantVector.push_back( atoi(tmp) );
1015
1016
1017                         fscanf(pFile,"%s",tmp); // TypeContourModel
1018                         fscanf(pFile,"%s",tmp); // ##
1019                         typeContourModel = atoi(tmp);
1020
1021                         manModelContour =  kernelManager->factoryManualContourModel(typeContourModel);
1022                         manModelContour->Open(pFile);
1023
1024                         fscanf(pFile,"%s",tmp); // TypeView
1025                         fscanf(pFile,"%s",tmp); // ##
1026                         typeView = atoi(tmp);  
1027
1028                         std::string theName;
1029                         theName = kernelManager->createOutline( manModelContour, instantVector );
1030                         bool addedModel = theName.compare("") != 0;
1031                         if( addedModel )
1032                         {
1033                                 double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
1034                                 _theViewPanel->getSpacing(spc);                                 
1035                                 //Adding the manualContourControler to interface objects structure
1036                                 //Adding the manualViewContour to interface objects structure           
1037                                 //_theViewPanel->getSceneManager()->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
1038                                 _theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc , typeView) ;
1039                         }       
1040
1041                         if (version==0) //StaticContours (will appear in all slices)
1042                         {
1043                                 Instant instant(&instantVector);
1044                                 kernelManager->changeContourOfManager( theName , &instant );
1045                         }
1046
1047                 }// for  numberOfContours       
1048         }
1049
1050         else if (compatible==false)
1051         {
1052                 wxDialog* dial = new wxDialog (this,-1,_T("Tools"),wxDefaultPosition, wxSize(260,160));
1053                 wxSizer* buttonsSizer = dial->CreateSeparatedButtonSizer(wxOK|wxCANCEL);
1054                 wxBoxSizer *dialSizer = new wxBoxSizer(wxVERTICAL);
1055
1056                 wxString lstOptOperation[2];
1057                 lstOptOperation[0]=_T("By Dimension");
1058                 lstOptOperation[1]=_T("By Spacing");
1059                 wxRadioBox * radioOpts = new wxRadioBox(dial, -1, _T("Type of Transformation"), wxDefaultPosition, wxSize(270,45), 2 , lstOptOperation,  2, wxRA_SPECIFY_COLS);         
1060                 
1061                 dialSizer->Add( new wxStaticText(dial,-1,_T("The image resolution is not compatible with the "))  , 0, wxGROW );
1062                 dialSizer->Add( new wxStaticText(dial,-1,_T("selected Roi file. Do you want to tranform it?"))  , 0, wxGROW );  
1063                 dialSizer->Add( new wxStaticText(dial,-1,_T(" "))  , 0, wxGROW );               
1064                 dialSizer->Add(radioOpts,0,wxGROW);
1065                 dialSizer->Add( new wxStaticText(dial,-1,_T(" "))  , 0, wxGROW );       
1066                 dialSizer->Add(buttonsSizer,0,wxGROW);
1067                 dial->SetSizer(dialSizer, true);
1068                 dial->Layout();
1069                 dial->ShowModal();
1070                 
1071                 int typeOfTransformation = -1;
1072                 bool transform = false;
1073
1074                 if (dial->GetReturnCode() == wxID_OK)
1075                 {
1076                         int typeOfTransformation = radioOpts->GetSelection();
1077                         transform = true;
1078
1079                 }
1080         
1081                 int i;
1082                 for (i=0;i<numberOfContours;i++)
1083                 {
1084                         instantVector.clear();
1085                         fscanf(pFile,"%s",tmp); // Instant
1086
1087                         fscanf(pFile,"%s",tmp); // 1
1088                         instantVector.push_back( atoi(tmp) );
1089                         fscanf(pFile,"%s",tmp); // 2
1090                         instantVector.push_back( atoi(tmp) );
1091                         fscanf(pFile,"%s",tmp); // 3
1092                         instantVector.push_back( atoi(tmp) );
1093                         fscanf(pFile,"%s",tmp); // 4
1094                         instantVector.push_back( atoi(tmp) );
1095                         fscanf(pFile,"%s",tmp); // 5
1096                         instantVector.push_back( atoi(tmp) );
1097                         fscanf(pFile,"%s",tmp); // 6
1098                         instantVector.push_back( atoi(tmp) );
1099
1100                         fscanf(pFile,"%s",tmp); // TypeContourModel
1101                         fscanf(pFile,"%s",tmp); // ##
1102                         typeContourModel = atoi(tmp);
1103
1104                         manModelContour =  kernelManager->factoryManualContourModel(typeContourModel);
1105                         manModelContour->Open(pFile);
1106                                 
1107                         if (transform)
1108                         {
1109                                 if (typeOfTransformation==0)
1110                                 {
1111                                         double transX, transY;
1112                                         transX = (double) imageDim[0]/tempDim[0];
1113                                         transY = (double) imageDim[1]/tempDim[1];
1114
1115                                         manModelContour->Transform_Ax_Plus_B(transX,0,transY,0);
1116                                 }
1117
1118                                 else if (typeOfTransformation==1)
1119                                 {
1120                                         double transX, transY;
1121                                         transX = (double) tempSpac[0]/imageSpac[0];
1122                                         transY = (double) tempSpac[1]/imageSpac[1];
1123
1124                                         manModelContour->Transform_Ax_Plus_B(transX,0,transY,0);
1125                                 }
1126                         }
1127
1128                         fscanf(pFile,"%s",tmp); // TypeView
1129                         fscanf(pFile,"%s",tmp); // ##
1130                         typeView = atoi(tmp);  
1131
1132                         std::string theName;
1133                         theName = kernelManager->createOutline( manModelContour, instantVector );
1134                         bool addedModel = theName.compare("") != 0;
1135                         if( addedModel )
1136                         {
1137                                 double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
1138                                 _theViewPanel->getSpacing(spc);                                 
1139                                 //Adding the manualContourControler to interface objects structure
1140                                 //Adding the manualViewContour to interface objects structure           
1141                                 //_theViewPanel->getSceneManager()->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
1142                                 _theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc , typeView) ;
1143                         }       
1144
1145                         if (version==0) //StaticContours (will appear in all slices)
1146                         {
1147                                 Instant instant(&instantVector);
1148                                 kernelManager->changeContourOfManager( theName , &instant );
1149                         }
1150                 }// for  numberOfContours       
1151         }
1152 }
1153
1154 void wxContourMainFrame::RefreshInterface(){
1155         changeInstant();
1156         _theViewPanel->RefreshInterface();
1157         //wxVtk2DBaseView *wxvtk2dbaseview = (wxVtk2DBaseView*)this->_theViewPanel->getWxVtkBaseView();
1158         //wxvtk2dbaseview->Refresh();
1159 }
1160
1161 vtkImageData* wxContourMainFrame::getImageData(){
1162         return _theViewPanel->getImageData();
1163 }
1164
1165 void wxContourMainFrame::onSegmentationOneSliceITK(wxString distance, wxString sigma, wxString alfa, wxString beta, wxString propagation, wxString iterations, wxString inflation)
1166 {
1167         //JCP 20-10-08 Undo redo implementation
1168         saveState();
1169         //JCP 20-10-08 Undo redo implementation
1170         
1171         wxBusyCursor wait;
1172         int                                     x                                       = _theViewPanel->GetX();
1173         int                                     y                                       = _theViewPanel->GetY();
1174         int                                     z                                       = _theViewPanel->GetZ();
1175         SegmentationOneSliceITK( x,y,z,distance, sigma, alfa, beta, propagation, iterations, inflation);
1176         RefreshInterface();
1177 }
1178
1179 void wxContourMainFrame::SegmentationOneSliceITK(int x, int y, int z, wxString distanc, wxString sigm, wxString alf, wxString bet, wxString prop, wxString iter, wxString inflation)
1180 {
1181         int typeofcontour = 1;
1182         //Image Data
1183         vtkImageData    *imagedata      = getImageData();
1184         
1185         //Tipo de pixeles a utilizar internamente en ITK
1186         typedef   float  InternalPixelType;
1187         const     unsigned int    Dimension = 2;
1188         typedef itk::Image< InternalPixelType, Dimension >  InternalImageType;
1189
1190         //Tipo de pixeles de salida 1
1191         typedef unsigned char OutputPixelType;
1192         typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
1193
1194         //Tipo de pixeles de salida 2
1195         typedef unsigned short OutputPixelType2;
1196         typedef itk::Image< OutputPixelType2, Dimension > OutputImageType2;
1197
1198         //DefiniciÛn del thresholder
1199         typedef itk::BinaryThresholdImageFilter< 
1200                                                         InternalImageType, 
1201                                                         OutputImageType    >    ThresholdingFilterType;
1202           
1203         //DefiniciÛn del primer filtro de conversiÛn de pixeles
1204         typedef itk::CastImageFilter<
1205                                 OutputImageType, OutputImageType2 >  CastFilterType;
1206
1207         //DefiniciÛn del segundo tipo de conversiÛn de pixeles
1208         typedef itk::CastImageFilter<
1209                                 OutputImageType2, InternalImageType >  CastFilterType2;
1210
1211         //Tercer tipo de conversiÛn
1212         typedef itk::RescaleIntensityImageFilter< 
1213                                                                 InternalImageType, 
1214                                                                 OutputImageType >   CastFilterType3;
1215
1216         //Cuarto tipo de conversiÛn
1217         typedef itk::RescaleIntensityImageFilter< 
1218                                                                 OutputImageType, 
1219                                                                 OutputImageType >   CastFilterType4;
1220
1221         ThresholdingFilterType::Pointer thresholder = ThresholdingFilterType::New();
1222                                 
1223         thresholder->SetLowerThreshold( 0.0 );
1224         thresholder->SetUpperThreshold( 128 );
1225
1226         thresholder->SetOutsideValue(  255  );
1227         thresholder->SetInsideValue(  0 );
1228
1229         //DefinciÛn de conexiÛnes entre VTK e ITK y el writer
1230         typedef itk::VTKImageToImageFilter<OutputImageType2> ConnectorType;
1231         typedef itk::ImageToVTKImageFilter<OutputImageType> ConnectorType2;
1232         typedef  itk::ImageFileWriter<  OutputImageType  > WriterType;
1233
1234         ConnectorType::Pointer connector= ConnectorType::New();
1235         ConnectorType2::Pointer connector2= ConnectorType2::New();
1236           
1237
1238         CastFilterType::Pointer filter=CastFilterType::New();
1239         CastFilterType2::Pointer filter2=CastFilterType2::New();
1240
1241         connector->SetInput( imagedata );
1242         filter2->SetInput(connector->GetOutput());
1243
1244         typedef   itk::CurvatureAnisotropicDiffusionImageFilter< 
1245                                                                 InternalImageType, 
1246                                                                 InternalImageType >  SmoothingFilterType;
1247
1248         SmoothingFilterType::Pointer smoothing = SmoothingFilterType::New();
1249
1250         typedef   itk::GradientMagnitudeRecursiveGaussianImageFilter< 
1251                                                                 InternalImageType, 
1252                                                                 InternalImageType >  GradientFilterType;
1253
1254         typedef   itk::SigmoidImageFilter<                               
1255                                                                 InternalImageType, 
1256                                                                 InternalImageType >  SigmoidFilterType;
1257
1258         GradientFilterType::Pointer  gradientMagnitude = GradientFilterType::New();
1259
1260         SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New();
1261
1262         sigmoid->SetOutputMinimum(  0.0  );
1263         sigmoid->SetOutputMaximum(  255.0  );
1264
1265
1266         typedef  itk::FastMarchingImageFilter< 
1267                                                                 InternalImageType, 
1268                                                                 InternalImageType >    FastMarchingFilterType;
1269
1270
1271         FastMarchingFilterType::Pointer  fastMarching = FastMarchingFilterType::New();
1272
1273         typedef  itk::GeodesicActiveContourLevelSetImageFilter< InternalImageType, 
1274                                         InternalImageType >    GeodesicActiveContourFilterType;
1275         GeodesicActiveContourFilterType::Pointer geodesicActiveContour = 
1276                                                                                 GeodesicActiveContourFilterType::New();
1277
1278         typedef  itk::ZeroCrossingImageFilter< 
1279                                                                 InternalImageType, 
1280                                                                 InternalImageType >    ZeroCrossingFilterType;
1281         ZeroCrossingFilterType::Pointer zeroCrossing =
1282                                                         ZeroCrossingFilterType::New();
1283
1284         const double propagationScaling = atof( crea::wx2std(prop).c_str() );
1285
1286         geodesicActiveContour->SetPropagationScaling( propagationScaling );
1287         geodesicActiveContour->SetCurvatureScaling( 1.0 );
1288         geodesicActiveContour->SetAdvectionScaling( 1.0 );
1289
1290         geodesicActiveContour->SetMaximumRMSError( 0.02 );
1291         int it=atoi(  crea::wx2std(iter).c_str() );
1292         geodesicActiveContour->SetNumberOfIterations( it );
1293
1294         smoothing->SetInput( filter2->GetOutput() );
1295         gradientMagnitude->SetInput( smoothing->GetOutput() );
1296         sigmoid->SetInput( gradientMagnitude->GetOutput() );
1297         fastMarching->SetInput( sigmoid->GetOutput() );
1298         geodesicActiveContour->SetInput( fastMarching->GetOutput() );
1299         geodesicActiveContour->SetFeatureImage( sigmoid->GetOutput() );
1300           
1301         zeroCrossing->SetInput( geodesicActiveContour->GetOutput() );
1302         //thresholder->SetInput( zeroCrossing->GetOutput() );
1303         thresholder->SetInput( geodesicActiveContour->GetOutput() );
1304         connector2->SetInput( thresholder->GetOutput()  );
1305           
1306
1307         smoothing->SetTimeStep( 0.125 );
1308         smoothing->SetNumberOfIterations(  5 );
1309         smoothing->SetConductanceParameter( 9.0 );
1310
1311
1312         const double sigma = atof(  crea::wx2std(sigm).c_str() );
1313         gradientMagnitude->SetSigma(  sigma  );
1314
1315         const double alpha =  atof(  crea::wx2std(alf).c_str() );
1316         const double beta  =  atof(  crea::wx2std(bet).c_str() );
1317
1318         sigmoid->SetAlpha( alpha );
1319         sigmoid->SetBeta(  beta  );
1320           
1321         typedef FastMarchingFilterType::NodeContainer  NodeContainer;
1322         typedef FastMarchingFilterType::NodeType       NodeType;
1323
1324         NodeContainer::Pointer seeds = NodeContainer::New();
1325
1326         InternalImageType::IndexType  seedPosition;
1327         seedPosition[0] = x;
1328         seedPosition[1] = y;
1329
1330         const double initialDistance = atof( crea::wx2std(distanc).c_str() );
1331
1332         NodeType node;
1333
1334         const double seedValue = - initialDistance;
1335
1336         node.SetValue( seedValue );
1337         node.SetIndex( seedPosition );
1338                 
1339         seeds->Initialize();
1340         seeds->InsertElement( 0, node );
1341
1342         fastMarching->SetTrialPoints( seeds );
1343
1344         fastMarching->SetSpeedConstant( 1.0 );
1345           
1346         fastMarching->SetOutputSize( 
1347                         connector->GetOutput()->GetBufferedRegion().GetSize() );
1348           
1349         fastMarching->SetStoppingValue( 800 );
1350         try
1351     {
1352                 
1353         connector2->Update();
1354         vtkImageData *idata = connector2->GetOutput();
1355
1356         vtkMarchingContourFilter* cntVTK = vtkMarchingContourFilter::New( );
1357         
1358         cntVTK->SetInput( idata );
1359         
1360         cntVTK->SetNumberOfContours( 1 );
1361         cntVTK->SetValue( 0, 255 );
1362         cntVTK->Update( );
1363         cntVTK->UpdateInformation();
1364                 
1365         vtkCleanPolyData* cpd = vtkCleanPolyData::New( );
1366         cpd->SetInput( cntVTK->GetOutput( ) );
1367         cpd->Update( );
1368         cpd->UpdateInformation();
1369
1370         vtkPolyDataConnectivityFilter* conn = vtkPolyDataConnectivityFilter::New( );
1371         conn->SetExtractionModeToLargestRegion( );
1372         conn->SetInput( cpd->GetOutput( ) );
1373         conn->Update( );
1374         conn->UpdateInformation();
1375
1376         vtkStripper* vtkstripper = vtkStripper::New( );
1377         vtkstripper->SetInput( conn->GetOutput() );
1378         vtkstripper->Update();
1379         vtkstripper->UpdateInformation();
1380
1381
1382         vtkPolyData* polyDataResult =  cntVTK->GetOutput();
1383         //std::cout<<"Points "<<polyDataResult->GetNumberOfPoints()<<std::endl;
1384         polyDataResult->Update( );
1385         polyDataResult->UpdateInformation();
1386
1387         //EED
1388                 /*
1389         ofstream myfile;
1390         myfile.open ("C:/Creatis/example.txt");
1391         myfile << "\n";
1392         polyDataResult->Print(myfile);
1393         myfile << "-------------------------------------\n";
1394         polyDataResult->GetLines()->Print(myfile);
1395         myfile.close();*/
1396
1397         cntVTK          -> Delete();
1398         cpd                     -> Delete();
1399         conn            -> Delete();
1400
1401
1402         //--Calculating control points
1403
1404         std::vector<double> vecX;
1405         std::vector<double> vecY;
1406         std::vector<double> vecXo;
1407         std::vector<double> vecYo;
1408         std::vector<double>::iterator vecXoi;
1409         std::vector<double>::iterator vecYoi;
1410         std::vector<double> vecZ;
1411
1412         std::vector<double> vecCtrlPointX;
1413         std::vector<double> vecCtrlPointY;
1414         std::vector<double> vecCtrlPointZ;
1415
1416
1417         double *p;
1418         double xAct=0;
1419         double yAct=0;
1420         int ii,size=polyDataResult->GetNumberOfPoints();
1421         ofstream myfile;
1422         myfile.open ("C:/Creatis/example2.txt");
1423
1424         size=polyDataResult->GetNumberOfPoints();
1425         for (ii=0;ii<size;ii++)
1426         {
1427                 if(ii==0)
1428                 {
1429                         xAct=x;
1430                         yAct=y;
1431                 }
1432                 p       = polyDataResult->GetPoint(ii);
1433                 double x=p[0];
1434                 double y=p[1];
1435                 /*if(fabs(yAct-y)>20)
1436                 {
1437                         if((xAct-x)>1 || (xAct-x)<-1)
1438                         {
1439                         vecX.push_back( p[0] );
1440                         vecY.push_back( p[1] );
1441                         myfile <<p[0]<<","<<p[1]<<"\n";
1442                         std::cout<<" x Anterior "<<xAct<<" x actual "<<x<<std::endl;
1443                 std::cout<<" y Anterior "<<yAct<<" y actual "<<y<<std::endl;
1444                 std::cout<<" x "<<p[0]<<" y "<<p[1]<<std::endl;
1445                         vecZ.push_back( 900 );
1446                         xAct=x;
1447                         yAct=y;
1448                         }
1449                         else
1450                         {
1451                                 vecXo.push_back(p[0]);
1452                                 vecYo.push_back(p[1]);
1453                         }
1454                         
1455                 }
1456                 else*/ if(fabs(xAct-x)>11)
1457                 {
1458                         vecXo.push_back(p[0]);
1459                         vecYo.push_back(p[1]);
1460                 }
1461                 else
1462                 {
1463                 vecX.push_back( p[0] );
1464                 myfile <<p[0]<<","<<p[1]<<"\n";
1465                 //std::cout<<" x Anterior "<<xAct<<" x actual "<<x<<std::endl;
1466                 //std::cout<<" y Anterior "<<yAct<<" y actual "<<y<<std::endl;
1467                 //std::cout<<" x "<<p[0]<<" y "<<p[1]<<std::endl;
1468                 vecY.push_back( p[1] );
1469                 vecZ.push_back( 900 );
1470                 xAct=x;
1471                 yAct=y;
1472                 }
1473                 
1474                 
1475         }
1476
1477         while(!vecXo.empty())
1478         {
1479                 vecX.push_back(vecXo.back());
1480                 //std::cout<<" x Siguiente "<<vecXo.back();
1481                 vecXo.pop_back();
1482                 vecZ.push_back( 900 );
1483         }
1484         while(!vecYo.empty())
1485         {
1486                 vecY.push_back(vecYo.back());
1487                         vecYo.pop_back();
1488         }
1489         myfile.close();
1490
1491         /*for(int l=0;l<vecX.size();l++)
1492         {
1493                 if(l==0)
1494                 {
1495             vecXo.push_back(p[0]);
1496                         vecYo.push_back(p[1]);
1497                 }
1498                 else
1499                 {
1500                         if(vecXoi[l-1]==)
1501                         {
1502                         }
1503                 }
1504
1505         }*/
1506
1507         ExtractControlPoints2D *extractcontrolpoints2d = new ExtractControlPoints2D();
1508
1509         extractcontrolpoints2d->SetContour( &vecX , &vecY , &vecZ );
1510         
1511         int method=2;
1512         if (method==0){
1513                 extractcontrolpoints2d->GetInitialControlPoints( &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
1514         }
1515         else if (method==1){
1516                 extractcontrolpoints2d->GetControlPoints(  &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
1517         }
1518         else if (method==2){
1519                 extractcontrolpoints2d->SetSamplingControlPoints( 15 );
1520                 extractcontrolpoints2d->GetSamplingControlPoints(  &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
1521         }
1522         //--Adding contour to the system
1523
1524         std::vector<int> actualInstantVector;
1525         _instantPanel->getInstant( actualInstantVector );
1526         actualInstantVector[1]=z;
1527
1528         int j,sizeCtrPt = vecCtrlPointX.size();
1529         
1530         manualContourModel *manModelContour =  kernelManager->factoryManualContourModel( typeofcontour );
1531         manModelContour->SetNumberOfPointsSpline( ((sizeCtrPt/100)+1)*100 );
1532         if (sizeCtrPt>=3){
1533                 for (j=0 ; j<sizeCtrPt ; j++)
1534                 {
1535                         manModelContour->AddPoint( vecCtrlPointX[j] , vecCtrlPointY[j] , vecCtrlPointZ[j]  );
1536                 } // for
1537                 std::string theName;
1538                 //theName = _modelManager->createOutline( manModelContour, actualInstantVector );
1539                 theName = kernelManager->createOutline( manModelContour, actualInstantVector );
1540                 bool addedModel = theName.compare("") != 0;
1541                 if( addedModel )
1542                 {
1543                         double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
1544                         _theViewPanel->getSpacing(spc); 
1545                         //Adding the manualContourControler to interface objects structure
1546                         //Adding the manualViewContour to interface objects structure           
1547                         //_theViewPanel->getSceneManager()->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
1548                         _theViewPanel->configureViewControlTo(theName, manModelContour, spc, typeofcontour);
1549                         //_theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc, typeofcontour ) ;
1550                 }       // if addedModel
1551         } // if sizeCtrPt
1552
1553                 
1554                  
1555                  WriterType::Pointer writer = WriterType::New();
1556          CastFilterType3::Pointer caster = CastFilterType3::New();
1557                  
1558                  caster->SetInput( gradientMagnitude->GetOutput() );
1559                  writer->SetInput( caster->GetOutput() );
1560                  writer->SetFileName("Gradient Magnitude.png");
1561                  caster->SetOutputMinimum(   0 );
1562                  caster->SetOutputMaximum( 255 );
1563                  writer->Update();
1564                 
1565                  CastFilterType3::Pointer caster2 = CastFilterType3::New();
1566                  WriterType::Pointer writer2 = WriterType::New();
1567
1568                  caster2->SetInput( sigmoid->GetOutput() );
1569                  writer2->SetInput( caster2->GetOutput() );
1570                  writer2->SetFileName("Sigmoid.png");
1571                  caster2->SetOutputMinimum(   0 );
1572                  caster2->SetOutputMaximum( 255 );
1573                  writer2->Update();
1574
1575                  CastFilterType3::Pointer caster3 = CastFilterType3::New();
1576                  WriterType::Pointer writer3 = WriterType::New();
1577
1578                  caster3->SetInput( fastMarching->GetOutput() );
1579                  writer3->SetInput( caster3->GetOutput() );
1580                  writer3->SetFileName("FastMarching.bmp");
1581                  caster3->SetOutputMinimum(   0 );
1582                  caster3->SetOutputMaximum( 255 );
1583                  writer3->Update();
1584
1585                  CastFilterType3::Pointer caster4 = CastFilterType3::New();
1586                  WriterType::Pointer writer4 = WriterType::New();
1587
1588                  caster4->SetInput( geodesicActiveContour->GetOutput() );
1589                  writer4->SetInput( caster4->GetOutput() );
1590                  writer4->SetFileName("GeodesicActiveContour.png");
1591                  caster4->SetOutputMinimum(   0 );
1592                  caster4->SetOutputMaximum( 255 );
1593                  writer4->Update();
1594
1595                  CastFilterType3::Pointer caster5 = CastFilterType3::New();
1596                  WriterType::Pointer writer5 = WriterType::New();
1597
1598                  caster5->SetInput( zeroCrossing->GetOutput() );
1599                  writer5->SetInput( caster5->GetOutput() );
1600                  writer5->SetFileName("ZeroCrossing.bmp");
1601                  caster5->SetOutputMinimum(   0 );
1602                  caster5->SetOutputMaximum( 255 );
1603                  writer5->Update();
1604     }
1605   catch( itk::ExceptionObject & excep )
1606     {
1607     std::cerr << "Exception caught !" << std::endl;
1608     std::cerr << excep << std::endl;
1609     }
1610 }
1611
1612 void wxContourMainFrame::onSegmentationOneSlice(int isovalue,int sampling,int method){
1613         
1614         //JCP 20-10-08 Undo redo implementation
1615         saveState();
1616         //JCP 20-10-08 Undo redo implementation
1617         
1618         wxBusyCursor wait;
1619         int                                     x                                       = _theViewPanel->GetX();
1620         int                                     y                                       = _theViewPanel->GetY();
1621         int                                     z                                       = _theViewPanel->GetZ();
1622         SegmentationOneSlice( x,y,z,isovalue, sampling, method );
1623         RefreshInterface();
1624 }
1625
1626
1627 void wxContourMainFrame::SegmentationOneSlice( int x, int y, int z, int isovalue, int sampling, int method )
1628 {               
1629         int typeofcontour = 1;
1630         //--Extracting Contour
1631         //vtkImageData  *imagedata      = _theViewPanel->getSceneManager()->GetImageData();
1632         vtkImageData    *imagedata      = getImageData();
1633 //              double                  *range          = imagedata->GetScalarRange();  
1634 //              double                  thr                     = 1;
1635
1636         vtkImageReslice *imageReslice = vtkImageReslice::New();
1637 //EED
1638 //              double spc[3];
1639 //              imagedata->GetSpacing(spc);
1640 //              x = x*spc[0];
1641 //              y = y*spc[1];
1642 //              z = z*spc[3];
1643
1644         imageReslice->SetInput( imagedata );
1645         imageReslice->SetInformationInput(imagedata);
1646         imageReslice->SetResliceAxesDirectionCosines(1,0,0, 0,1,0 ,0,0,1);
1647         imageReslice->SetResliceAxesOrigin(0,0,z);
1648         imageReslice->SetOutputDimensionality(2);
1649         imageReslice->SetInterpolationModeToLinear();
1650
1651         imagedata = imageReslice->GetOutput();
1652         imagedata->Update();
1653         imagedata->UpdateInformation();
1654
1655         vtkContourFilter* cntVTK = vtkContourFilter::New( );
1656         cntVTK->SetInput( imagedata );
1657
1658         cntVTK->SetNumberOfContours( 1 );
1659         //cntVTK->SetValue( 0, vmin );
1660 //              cntVTK->SetValue( 0, (range[1]*thr/100) );
1661         cntVTK->SetValue( 1, isovalue );
1662 //      cntVTK->SetValue( 1, vmax );
1663         cntVTK->Update( );
1664         cntVTK->UpdateInformation();
1665                 
1666         vtkCleanPolyData* cpd = vtkCleanPolyData::New( );
1667         cpd->SetInput( cntVTK->GetOutput( ) );
1668         cpd->ConvertLinesToPointsOff( );
1669         cpd->Update( );
1670         cpd->UpdateInformation();
1671
1672         vtkPolyDataConnectivityFilter* conn = vtkPolyDataConnectivityFilter::New( );
1673         conn->SetExtractionModeToClosestPointRegion( );
1674         //conn->SetMaxRecursionDepth( 3000 );
1675                 
1676         conn->SetInput( cpd->GetOutput( ) );
1677                 
1678         conn->SetClosestPoint( x, y, 0 );
1679         conn->Update( );
1680         conn->UpdateInformation();
1681                 
1682         vtkCleanPolyData* cpd2 = vtkCleanPolyData::New( );
1683         cpd2->SetInput( conn->GetOutput( ) );
1684         cpd2->Update();
1685         cpd2->UpdateInformation();
1686
1687         vtkStripper* vtkstripper = vtkStripper::New( );
1688         vtkstripper->SetInput( cpd2->GetOutput() );
1689         vtkstripper->Update();
1690         vtkstripper->UpdateInformation();
1691
1692
1693         vtkPolyData* polyDataResult =  vtkstripper->GetOutput();
1694
1695         polyDataResult->Update( );
1696         polyDataResult->UpdateInformation();
1697
1698 /* EED
1699 ofstream myfile;
1700 myfile.open ("c:/temp/example.txt");
1701 myfile << "\n";
1702 polyDataResult->Print(myfile);
1703 myfile << "-------------------------------------\n";
1704 polyDataResult->GetLines()->Print(myfile);
1705 myfile.close();
1706 */
1707
1708         cntVTK          -> Delete();
1709         cpd2            -> Delete();
1710         cpd                     -> Delete();
1711         conn            -> Delete();
1712
1713
1714 //--Calculating control points
1715
1716         std::vector<double> vecX;
1717         std::vector<double> vecY;
1718         std::vector<double> vecZ;
1719
1720         std::vector<double> vecCtrlPointX;
1721         std::vector<double> vecCtrlPointY;
1722         std::vector<double> vecCtrlPointZ;
1723
1724
1725         double *p;
1726         int ii,size=polyDataResult->GetNumberOfPoints();
1727         int id;
1728         for (ii=1;ii<=size;ii++)
1729         {
1730                 id      = polyDataResult->GetLines()->GetData()->GetValue(ii);
1731                 p       = polyDataResult->GetPoint(id);
1732 //              double x=p[0];
1733 //              double y=p[1];
1734                 vecX.push_back( p[0] );
1735                 vecY.push_back( p[1] );
1736                 vecZ.push_back( 900 );
1737 //                      vecZ.push_back( p[2] );
1738         }
1739
1740
1741         ExtractControlPoints2D *extractcontrolpoints2d = new ExtractControlPoints2D();
1742         extractcontrolpoints2d->SetContour( &vecX , &vecY , &vecZ );
1743
1744 //PROOFS
1745         /*if (methodRadiobox->GetSelection()==0){
1746                 extractcontrolpoints2d->GetInitialControlPoints( &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
1747         }
1748         if (methodRadiobox->GetSelection()==1){
1749                 extractcontrolpoints2d->GetControlPoints(  &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
1750         }
1751         if (methodRadiobox->GetSelection()==2){
1752                 extractcontrolpoints2d->SetSamplingControlPoints( sampling );
1753                 extractcontrolpoints2d->GetSamplingControlPoints(  &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
1754         }*/
1755
1756         if (method==0){
1757                 extractcontrolpoints2d->GetInitialControlPoints( &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
1758         }
1759         else if (method==1){
1760                 extractcontrolpoints2d->GetControlPoints(  &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
1761         }
1762         else if (method==2){
1763                 extractcontrolpoints2d->SetSamplingControlPoints( sampling );
1764                 extractcontrolpoints2d->GetSamplingControlPoints(  &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
1765         }
1766
1767         //--Adding contour to the system
1768
1769         std::vector<int> actualInstantVector;
1770         _instantPanel->getInstant( actualInstantVector );
1771         actualInstantVector[1]=z;
1772
1773         int j,sizeCtrPt = vecCtrlPointX.size();
1774         manualContourModel *manModelContour =  kernelManager->factoryManualContourModel( typeofcontour );
1775         manModelContour->SetNumberOfPointsSpline( ((sizeCtrPt/100)+1)*100 );
1776         if (sizeCtrPt>=3){
1777                 for (j=0 ; j<sizeCtrPt ; j++)
1778                 {
1779                         manModelContour->AddPoint( vecCtrlPointX[j] , vecCtrlPointY[j] , vecCtrlPointZ[j]  );
1780                 } // for
1781                 std::string theName;
1782                 //theName = _modelManager->createOutline( manModelContour, actualInstantVector );
1783                 theName = kernelManager->createOutline( manModelContour, actualInstantVector );
1784                 bool addedModel = theName.compare("") != 0;
1785                 if( addedModel )
1786                 {
1787                         double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
1788                         _theViewPanel->getSpacing(spc);                                 
1789                         //Adding the manualContourControler to interface objects structure
1790                         //Adding the manualViewContour to interface objects structure           
1791                         //_theViewPanel->getSceneManager()->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
1792                         _theViewPanel->configureViewControlTo(theName, manModelContour, spc, typeofcontour);
1793                         //_theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc, typeofcontour ) ;
1794                 }       // if addedModel
1795         } // if sizeCtrPt
1796 }
1797 int wxContourMainFrame::GetImageDataSizeZ(){
1798         return _theViewPanel->GetImageDataSizeZ();
1799 }
1800
1801 void wxContourMainFrame::GetImageDataRange(double *range){
1802         _theViewPanel->GetImageDataRange(range);
1803 }
1804
1805 void wxContourMainFrame::onSegmentationAllSlice(int minZ,int maxZ,int isovalue,int sampling,int method){
1806         //JCP 20-10-08 Undo redo implementation
1807         saveState();
1808         //JCP 20-10-08 Undo redo implementation
1809         
1810         wxBusyCursor wait;
1811         int                                     x                                       = _theViewPanel->GetX();
1812         int                                     y                                       = _theViewPanel->GetY();
1813         int z;
1814         double porcent; 
1815         wxString tmpString;     
1816         double totalZ = maxZ-minZ+1;
1817         for( z=minZ ; z<=maxZ ; z++ )
1818         {
1819                 porcent = 100.0* (z-minZ)/totalZ;
1820                 tmpString.Printf(_T("  %d %c            %d/%d            %d"), (int)porcent , 37 , z-minZ+1, (int)totalZ,z );
1821                 interfMainPanel::getInstance()->setLabelSegmentationPanelVTK(tmpString);
1822                 //_staticTextSegmentation->SetLabel(tmpString);
1823                 SegmentationOneSlice( x,y,z,isovalue, sampling,method );
1824         }
1825         interfMainPanel::getInstance()->setLabelSegmentationPanelVTK(_T("   "));
1826         RefreshInterface();
1827 }
1828
1829
1830 //Creates a reference line to be used as the axis of the mirroring
1831 void wxContourMainFrame::referenceLine()
1832 {
1833         if (_refLineControl==NULL)
1834         {
1835                 wxBusyCursor wait;
1836                 double spc[3];
1837
1838                 vtkImageData *vtkimagedata = _theViewPanel->getImageData();
1839                 vtkimagedata->GetSpacing(spc);
1840
1841                 wxVtkBaseView * viewer2D = _theViewPanel->getWxVtkBaseView();
1842
1843                 _refLineControl = new manualLineControler();
1844                 _refLineModel   = new manualContourModelLine();
1845                 _refLineView = new manualViewLine();
1846                 _refLineView->SetModel( _refLineModel );
1847                 _refLineView->SetWxVtkBaseView( viewer2D );
1848                 _refLineView->SetRange( 2 );
1849                 _refLineView->SetZ( 1200 );
1850
1851                 _refLineView->SetSpacing(spc);
1852
1853                 _refLineView->SetColorNormalContour(0, 0, 1);
1854                 _refLineView->SetColorEditContour(0, 0.5, 0.5);
1855                 _refLineView->SetWidthLine(4);
1856
1857                 _refLineControl->SetModelView( _refLineModel , _refLineView );
1858                 vtkInteractorStyleBaseView* style = (vtkInteractorStyleBaseView*)viewer2D->GetInteractorStyleBaseView();
1859                 style->AddInteractorStyleMaracas( _refLineControl );
1860                 _refLineModel->SetCloseContour(false);
1861                 _refLineControl->CreateNewManualContour();
1862
1863 //AD: Inicializar el mirroring con una linea ya pintada 
1864         /*
1865                 double z = _refLineControl->GetZ();
1866
1867                 int imageDim[3];
1868                 image->GetDimensions(imageDim);
1869                 double x = (double) imageDim[0]/2;
1870                 double y1 = (double) (imageDim[1]/2)+15;
1871                 double y2 = (double) (imageDim[1]/2)-15;
1872
1873                 _refLineControl->AddPoint(x,y1,z);
1874                 _refLineControl->AddPoint(x,y2,z);
1875                 _refLineControl->SetCompleteCreation(true);
1876
1877                 _refLineModel->AddPoint(x,y1,z);
1878                 _refLineModel->AddPoint(x,y2,z);
1879                 _refLineModel->UpdateSpline();
1880
1881                 _refLineView->UpdateViewPoint(0);
1882                 _refLineView->UpdateViewPoint(1);
1883         */
1884
1885                 _refLineControl->SetActive(true);
1886                 _refLineView->RefreshContour();
1887         }
1888 }
1889
1890 //Hides the referenceLine
1891 void wxContourMainFrame::refLineHide()
1892 {
1893         if (_refLineControl!=NULL)
1894         {
1895                 if (_refLineControl->GetActive())
1896                 {
1897                         _refLineView->RemoveCompleteContourActor();
1898                         _refLineControl->SetEditable(false);
1899                         _refLineControl->SetActive(false);
1900
1901                         RefreshInterface();
1902                 }
1903         }
1904 }
1905
1906 //Shows the referenceLine
1907 void wxContourMainFrame::refLineShow()
1908 {
1909         if (_refLineControl!=NULL)
1910         {
1911                 if (_refLineControl->GetActive()==false)
1912                 {
1913                         wxVtkBaseView * viewer2D = _theViewPanel->getWxVtkBaseView();
1914
1915                         _refLineView->SetModel( _refLineModel );
1916                         _refLineView->SetWxVtkBaseView( viewer2D );
1917                         _refLineView->SetRange( 2 );
1918                         _refLineView->SetZ( 1200 );
1919
1920                         _refLineControl->SetModelView( _refLineModel , _refLineView );
1921                         vtkInteractorStyleBaseView* style = (vtkInteractorStyleBaseView*)viewer2D->GetInteractorStyleBaseView();
1922                         style->AddInteractorStyleMaracas( _refLineControl );
1923                         _refLineControl->CreateNewManualContour();
1924                         _refLineControl->SetActive(true);
1925                         _refLineView->RefreshContour();
1926
1927                         RefreshInterface();
1928                 }
1929         }
1930 }
1931
1932 void wxContourMainFrame::refLineChangeWidth(int width)
1933 {
1934         _refLineView->SetWidthLine(width);
1935         _refLineView->RefreshContour();
1936
1937         RefreshInterface();
1938 }
1939
1940
1941 void wxContourMainFrame::onMirror()
1942 {
1943         //AD:02-09
1944         std::vector<std::string> currentSelection = _theViewPanel->getSelectedObjects();
1945         std::vector<std::string> filterCurrentSelection;
1946
1947         std::vector<int> tempVector;
1948         _instantPanel->getInstant( tempVector );
1949     _performingOperation->reset();
1950         _performingOperation->setStartCommand( COPY );
1951         _performingOperation->setStartOperationInstantVector( tempVector );
1952         _performingOperation->setKeyNamesOperationElems( currentSelection );
1953
1954         char theStartCommand = _performingOperation->getStartCommand();
1955         if (  theStartCommand == COPY )
1956         {
1957                 //JCP 20-10-08 Undo redo implementation
1958                 saveState();
1959                 //JCP 20-10-08 Undo redo implementation
1960                 std::vector<int> tempVector;
1961                 _instantPanel->getInstant( tempVector );
1962                 _performingOperation->setEndOperationInstantVector ( tempVector );
1963                 std::vector<std::string> elems = _performingOperation->getKeyNamesOperationElems();
1964                 int i,size = elems.size();                      
1965                 for( i=0; i<size; i++ )
1966                 {                               
1967                         createMirrorContourOf( elems[i], tempVector, i>0 );
1968                 }               
1969         }
1970
1971         //deleteContour( _refName );
1972         //_refName = "";
1973 }
1974
1975 void wxContourMainFrame::onThreshold()
1976 {
1977         int     z = _theViewPanel->GetZ();
1978         double range[2];
1979
1980         vtkImageData * img = getImageData();
1981         img->GetScalarRange(range);
1982
1983         int minTot = floor (range[0]);
1984         int maxTot = ceil (range[1]);
1985
1986         double minMax[2];
1987         _pannew->onThresholdInstantChange(minMax);
1988         int minVal = floor (minMax[0]);
1989         int maxVal = floor (minMax[1]);
1990
1991         if (!_actorPresent)
1992         {
1993                 if (_imageReslicer==NULL)
1994                 {
1995                         _imageReslicer = vtkImageReslice::New();
1996                         _imageReslicer->SetInput( img );
1997                         _imageReslicer->SetInformationInput(img);
1998                         _imageReslicer->SetResliceAxesDirectionCosines(1,0,0, 0,1,0 ,0,0,1);
1999                         _imageReslicer->SetOutputDimensionality(2);
2000                         _imageReslicer->SetInterpolationModeToLinear();
2001                 }
2002
2003                 _imageReslicer->SetResliceAxesOrigin(0,0,z);
2004
2005                 img = _imageReslicer->GetOutput();
2006                 img->Update();
2007                 img->UpdateInformation();
2008
2009                 wxVtkBaseView * baseView = _theViewPanel->getWxVtkBaseView();
2010
2011                 if (_thresholdTable==NULL)
2012                 {
2013                         //Lookup Table
2014                         _thresholdTable = vtkLookupTable::New();
2015                         _thresholdTable->SetNumberOfTableValues(maxTot+1);
2016                         _thresholdTable->SetTableRange(range); 
2017                         _thresholdTable->SetAlphaRange(0, 1);
2018                         _thresholdTable->SetValueRange(0, 1);
2019                         _thresholdTable->SetSaturationRange(0, 0); 
2020                         _thresholdTable->SetRampToLinear( );
2021                 }
2022
2023                 //Assign a fake color for the upper image, and set the white as transparent
2024                 int i;
2025                 for(i = minTot; i <= maxTot; i++)
2026                 {
2027                         if( i >= minVal && i <= maxVal )
2028                         {
2029                                 _thresholdTable->SetTableValue(i, 1.0, 0.0, 0.0, 1);
2030                         }
2031                         else if( i >= minTot && i < minVal )
2032                         {
2033                                 _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent
2034                         }
2035                         else if( i > maxVal && i < maxTot )
2036                         {
2037                                 _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent
2038                         }
2039                         else
2040                         {
2041                                 _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent
2042                         }
2043                 }
2044                 _thresholdTable->Build( );
2045         
2046                 if (_thresholdMapper==NULL)
2047                 {
2048                         _thresholdMapper = vtkImageMapToColors::New( );
2049                 }
2050                 
2051                 _thresholdMapper->SetLookupTable( _thresholdTable );
2052                 _thresholdMapper->SetInput( img );
2053
2054                 if (_thresholdActor==NULL)
2055                 {
2056                         _thresholdActor = vtkImageActor::New( );
2057                         _thresholdActor->SetOpacity( 0.6 );
2058                         _thresholdActor->InterpolateOn(  );
2059                         _thresholdActor->SetPosition( 0,0, 900-1 );
2060                 }
2061                 
2062                 _thresholdActor->SetInput( _thresholdMapper->GetOutput() );
2063
2064                 baseView->GetRenderer()->AddActor( _thresholdActor );
2065                 _actorPresent = true;
2066         }
2067
2068         else
2069         {
2070                 _imageReslicer->SetResliceAxesOrigin(0,0,z);
2071                 img = _imageReslicer->GetOutput();
2072                 img->Update();
2073                 img->UpdateInformation();
2074
2075                 //Assign a fake color for the upper image, and set the white as transparent
2076                 int i;
2077                 for(i = minTot; i <= maxTot; i++)
2078                 {
2079                         if( i >= minVal && i <= maxVal )
2080                         {
2081                                 _thresholdTable->SetTableValue(i, 1.0, 0.0, 0.0, 1);
2082                         }
2083                         else if( i >= minTot && i < minVal )
2084                         {
2085                                 _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent
2086                         }
2087                         else if( i > maxVal && i < maxTot )
2088                         {
2089                                 _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent
2090                         }
2091                         else
2092                         {
2093                                 _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent
2094                         }
2095                 }
2096
2097                 _thresholdTable->Build( );
2098                 _thresholdMapper->SetLookupTable( _thresholdTable );
2099                 _thresholdMapper->SetInput( img );
2100                 _thresholdActor->SetInput( _thresholdMapper->GetOutput() );
2101         }
2102                         /*
2103                                 vtkImageViewer2* viewer = vtkImageViewer2::New();        
2104                                 viewer->SetInput( upperImageActor->GetInput() ); 
2105                                 viewer->SetColorLevel((range[1]-range[0])/2);
2106                                 viewer->SetColorWindow(range[1]);
2107                                 viewer->GetRenderer()->AddActor( upperImageActor );
2108                                 viewer->Render();
2109                         */
2110         _theViewPanel->RefreshInterface();
2111 }
2112
2113
2114 void wxContourMainFrame::onThresholdChange()
2115 {
2116         if (_actorPresent)
2117         {
2118                 onThreshold();
2119         }
2120 }
2121
2122 void wxContourMainFrame::onThresholdInterpolation(bool interpolate)
2123 {
2124         if (_thresholdActor!=NULL)
2125         {
2126                 if (interpolate)
2127                 {
2128                         _thresholdActor->InterpolateOn( );
2129                 }
2130
2131                 else
2132                 {
2133                         _thresholdActor->InterpolateOff( );
2134                 }
2135
2136                 _theViewPanel->RefreshInterface();
2137         }
2138 }
2139
2140 void wxContourMainFrame::onThresholdChangeOpacity (int opacity)
2141 {
2142         if (_actorPresent)
2143         {
2144                 _thresholdActor->SetOpacity(opacity*0.1);
2145         }
2146
2147         _theViewPanel->RefreshInterface();
2148 }
2149
2150 void wxContourMainFrame::onThresholdRemove()
2151 {
2152         if (_actorPresent)
2153         {
2154                 wxVtkBaseView * baseView = _theViewPanel->getWxVtkBaseView();
2155                 baseView->GetRenderer()->RemoveActor( _thresholdActor );
2156                 _actorPresent = false;
2157         }
2158
2159         _theViewPanel->RefreshInterface();
2160 }
2161
2162 void wxContourMainFrame::showAxis(bool show)
2163 {
2164         _theViewPanel->SetVisibleAxis(show);
2165         _theViewPanel->Refresh();
2166 }
2167
2168
2169 void wxContourMainFrame::onRigidPressed(){
2170         std::vector<std::string> currentSelection = _theViewPanel->getSelectedObjects();
2171         int elementsSelected = currentSelection.size();
2172
2173         if ( elementsSelected >= 1 ){
2174                 //JCP 20-10-08 Undo redo implementation
2175                 saveState();
2176                 //JCP 20-10-08 Undo redo implementation
2177
2178                 std::vector<int> tempVector;
2179                 _instantPanel->getInstant( tempVector );
2180                 Instant instant(&tempVector);
2181
2182                 int i , size=currentSelection.size();
2183                 for ( i=0 ; i<size ; i++ )
2184                 {
2185                         kernelManager->changeContourOfManager(currentSelection[i], &instant);
2186                 } // i
2187         }
2188 }
2189
2190 void wxContourMainFrame::onWidthOfContour(double width){
2191
2192         _theViewPanel->removeSceneContours();
2193         _theViewPanel->SetWidthContour(width);
2194         
2195         //_theViewPanel->getSceneManager()->SetWidthContour( width );
2196
2197         RefreshInterface();
2198 }
2199
2200 int wxContourMainFrame::getColorWindow()
2201 {
2202         /*
2203         double range[2];
2204         vtkImageData * img = getImageData();
2205         img->GetScalarRange(range);
2206
2207         std::cout<<"Val 1: "<<range[0]<<" Val 2: "<<range[1]<<std::endl;
2208         
2209         return (int)range[1];
2210         */
2211         return _theViewPanel->getColorWindow();
2212 }
2213
2214 int wxContourMainFrame::getWindowLevel()
2215 {
2216         /*
2217         double range[2];
2218         vtkImageData * img = getImageData();
2219         img->GetScalarRange(range);
2220
2221         std::cout<<"Val 1: "<<range[0]<<" Val 2: "<<range[1]<<std::endl;
2222         
2223         return (int)range[1];
2224         */
2225         return _theViewPanel->getWindowLevel();
2226 }
2227
2228 void wxContourMainFrame::onBrigthnessColorWindowLevel(int colorwindow,int windowlevel){
2229         _theViewPanel->onBrigthnessColorWindowLevel(colorwindow, windowlevel);
2230
2231         RefreshInterface();
2232 }
2233
2234 void wxContourMainFrame::onInterpolation(bool interpolate){
2235         _theViewPanel->onInterpolation(interpolate);    
2236         RefreshInterface();
2237 }
2238
2239 void wxContourMainFrame::onChangeInstant(std::string name,int actual){
2240         _instantPanel->setConceptValue( name, actual );
2241 }
2242
2243 void wxContourMainFrame::resetAppend(){
2244         kernelManager->resetAppend();
2245         
2246 }
2247
2248 void wxContourMainFrame::onSpreadAdd(){
2249         std::vector<double> vecX; 
2250         std::vector<double> vecY; 
2251         std::vector<double> vecZ; 
2252         _theViewPanel->GetPointsOfActualContour(&vecX , &vecY , &vecZ );
2253         
2254         std::vector<int> tempVector;
2255         _instantPanel->getInstant( tempVector );
2256
2257         std::string val = kernelManager->onSpreadAdd(&vecX , &vecY , &vecZ, tempVector);
2258
2259         interfMainPanel::getInstance()->appendStringSpread(val);
2260         
2261 }
2262
2263 void wxContourMainFrame::onSpreadGo(int type){
2264
2265         //JCP 20-10-08 Undo redo implementation
2266         saveState();
2267         //JCP 20-10-08 Undo redo implementation
2268
2269         wxBusyCursor wait;      
2270         std::vector<double> vecCtrlPointX;
2271         std::vector<double> vecCtrlPointY;
2272         std::vector<double> vecCtrlPointZ;
2273         double  minZ,maxZ;
2274         int z;
2275
2276         std::vector<int> tempVector;
2277         _instantPanel->getInstant( tempVector );
2278 //              tempVector[1];
2279
2280         kernelManager->getMaxMinZ(&minZ,&maxZ);
2281 //JSTG_16-07-08_----------------------------------------------------------------
2282         //_contourPropagation->setInterpolationNumber(maxZ-minZ+1);
2283         kernelManager->CalculeSplinePropagation();
2284
2285         double          totalZ = maxZ-minZ+1;
2286         double          porcent;
2287         wxString        tmpString;
2288 //--------------------------------------------------------------------
2289         for ( z=(int)minZ ; z<=(int)maxZ ; z++ )
2290         {
2291                 porcent = 100.0* (z-minZ)/totalZ;
2292                 int numero = (int)(z-minZ+1)/(int)totalZ;
2293                 std::string stringtemp = "  "+kernelManager->intToString(porcent)+"%            "+kernelManager->intToString(numero)+"            "+kernelManager->intToString(z);
2294                 
2295                 interfMainPanel::getInstance()->setStringSpread(stringtemp);    
2296
2297                 int typeofcontour = 1;
2298                 std::string theName;
2299                 manualContourModel* manModelContour = kernelManager->GetPoints(z, type, &vecCtrlPointX,&vecCtrlPointY,&vecCtrlPointZ, theName,typeofcontour, tempVector);
2300
2301                 if( manModelContour!=NULL ){
2302                         double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
2303                         this->_theViewPanel->getSpacing(spc);                                   
2304                         //Adding the manualContourControler to interface objects structure
2305                         //Adding the manualViewContour to interface objects structure           
2306                         //_theViewPanel->getSceneManager()->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
2307                         _theViewPanel->configureViewControlTo( theName, manModelContour,spc,typeofcontour ) ;
2308                 } // if addedModel
2309         } 
2310         if(z > maxZ){
2311                 porcent = 100.0;
2312                 int numero = (int)(z-minZ+1)/(int)totalZ;
2313                 std::string stringtemp = "  "+kernelManager->intToString(porcent)+"%            "+kernelManager->intToString(numero)+"            "+kernelManager->intToString(z);
2314                 
2315                 interfMainPanel::getInstance()->setStringSpread(stringtemp);
2316         }// for z
2317         //RefreshInterface();
2318 }
2319
2320 void wxContourMainFrame::getInstantVector(std::vector<int>& tempVector){
2321         
2322 }
2323
2324 std::vector<std::string> wxContourMainFrame::getOutlinesName(int slide){
2325         std::vector<int> tempVector;
2326         _instantPanel->getInstant(tempVector);
2327         //Asignation of slide number should be different ex by name
2328         tempVector[1]=slide;
2329         return kernelManager->getOutlinesNameAtInstant(tempVector);
2330 }
2331
2332 void wxContourMainFrame::onInformationContourLabels(int typeContourGroup,int selection,int minimumZ,int maximumZ)
2333 {
2334         int maxContourGroup     =       0;
2335
2336         ContourExtractData      *contourextractdata = new ContourExtractData();
2337         
2338         contourextractdata ->SetTypeOperation( typeContourGroup % 3 );
2339
2340         std::vector<manualContourModel*> lstManConMod;
2341         std::vector<manualContourModel*> lstManConModTmp;
2342         std::vector<manualContourModel*> lstManConModExp;
2343         std::vector<double> pLstValue;
2344         std::vector<double> pLstValuePosX;
2345         std::vector<double> pLstValuePosY;
2346         std::vector<double> pLstValuePosZ;
2347
2348         int             resultSize; 
2349         int             resultGrayRangeCount;
2350         double  resultMin; 
2351         double  resultMax;
2352         double  resultAverage;
2353         double  resultStandardeviation;
2354
2355         std::vector<int> tempVector;
2356         _instantPanel->getInstant( tempVector );
2357
2358         vtkImageData *imagedata = _theViewPanel->getImageData();
2359         int sizeZ = _theViewPanel->GetImageDataSizeZ();
2360         int z;
2361         int ii,sizeLstContourThings;
2362
2363
2364         int minZ,maxZ;
2365         double totalZ;
2366         double porcent; 
2367         wxString tmpString;
2368
2369         
2370
2371         if (selection==0 ) // actual slice
2372         {
2373                 std::vector<int> tempVector;
2374                 _instantPanel->getInstant( tempVector );
2375                 int actualSlice = tempVector[1];
2376                 minZ    = actualSlice;
2377                 maxZ    = actualSlice;
2378         }
2379         else if (selection==2 ) // All slices
2380         {
2381                 minZ    = 0;
2382                 maxZ    = sizeZ-1;
2383         }
2384         else if (selection==1 ) // slice range
2385         {
2386                 minZ    = minimumZ;
2387                 maxZ    = maximumZ;
2388         }
2389         
2390
2391         totalZ  = maxZ-minZ+1;
2392         contourextractdata->SetImage( imagedata);
2393
2394 // For each slice..
2395         for ( z=minZ ; z<=maxZ ; z++ )
2396         {
2397                 
2398                 porcent = 100.0* (z-minZ)/totalZ;
2399                 tmpString.Printf(_T("  %d %c            %d/%d             %d"), (int)porcent , 37 , z-minZ+1, (int)totalZ ,z);
2400
2401                 interfMainPanel::getInstance()->setStringInfoPanel(tmpString);          
2402                 //_staticTextInformation->SetLabel(tmpString);
2403
2404                 //Extraction data from contours of each slice
2405                 contourextractdata->SetZtoBeAnalys(z);
2406
2407                 tempVector[1]=z;
2408                 Instant instant(&tempVector);
2409                 std::vector<ContourThing**> lstContourThings = kernelManager->getOutlinesAtInstant( &instant );
2410                 sizeLstContourThings = lstContourThings.size();
2411
2412                 lstManConMod.clear();
2413                 for (ii=0 ; ii<sizeLstContourThings ; ii++)
2414                 {
2415                         ContourThing **contourthing = lstContourThings[ii];
2416                         lstManConMod.push_back( (*contourthing)->getModel() );
2417                 }
2418                 lstManConModExp =  kernelManager->ExploseEachModel( lstManConMod );
2419
2420
2421                 wxString tempString;
2422                 tempString.Printf(_T("%d - %d"),z, sizeLstContourThings);
2423                 interfMainPanel::getInstance()->setRowLabelInfoPanel(z, tempString);
2424                 //_grid->SetRowLabelValue(z, tempString );
2425 //EED004
2426                 int iContourGroup,sizeContourGroup;
2427                 if (typeContourGroup==3) // contour separete
2428                 {
2429                         sizeContourGroup=lstManConModExp.size();
2430                         if ( maxContourGroup<sizeContourGroup ) 
2431                         {
2432                                 maxContourGroup=sizeContourGroup;
2433                         }
2434                 } else {  // contour AND OR XOR
2435                         sizeContourGroup=1;
2436                         maxContourGroup=1;
2437                 }
2438
2439                 int tmpIntA;
2440
2441
2442
2443                 for( iContourGroup=0 ; iContourGroup<sizeContourGroup ; iContourGroup++ ){
2444                         lstManConModTmp.clear();
2445                         if (typeContourGroup==3) // contour separete
2446                         {
2447                                 lstManConModTmp.push_back( lstManConModExp[iContourGroup]);
2448                         } else {  // contour AND OR XOR
2449                                 lstManConModTmp = lstManConModExp;
2450                         }
2451
2452                         contourextractdata->SetLstManualContourModel( lstManConModTmp );
2453
2454                         pLstValue.clear();
2455                         pLstValuePosX.clear();
2456                         pLstValuePosY.clear();
2457                         pLstValuePosZ.clear();
2458                         contourextractdata->GetValuesInsideCrown(       &pLstValue,
2459                                                                                                                 &pLstValuePosX,
2460                                                                                                                 &pLstValuePosY,
2461                                                                                                                 &pLstValuePosZ);
2462                         // Statistics of each slice.
2463                         contourextractdata->Statistics( &pLstValue,
2464                                                                                         minimumZ,
2465                                                                                         maximumZ,
2466                                                                                         &resultGrayRangeCount, 
2467                                                                                         &resultSize, 
2468                                                                                         &resultMin, 
2469                                                                                         &resultMax,
2470                                                                                         &resultAverage,
2471                                                                                         &resultStandardeviation);
2472                         
2473                         if (interfMainPanel::getInstance()->getNumberColsInformationPanel()<_numberOfVariablesStatistics*(iContourGroup+1)  )
2474                         {
2475                                 interfMainPanel::getInstance()->appendColsInformationPanel(_numberOfVariablesStatistics);
2476                         }
2477
2478                         tmpIntA=_numberOfVariablesStatistics*iContourGroup ;
2479
2480                         tempString.Printf(_T("%d"),resultSize);
2481                         interfMainPanel::getInstance()->setCellValueInfoPanel(z, tmpIntA, tempString);  
2482
2483                         tempString.Printf(_T("%d"),resultGrayRangeCount);
2484                         interfMainPanel::getInstance()->setCellValueInfoPanel(z, tmpIntA+1, tempString);
2485                         
2486                         tempString.Printf(_T("%f"),resultMin);
2487                         interfMainPanel::getInstance()->setCellValueInfoPanel(z, tmpIntA+2, tempString);
2488                         
2489                         tempString.Printf(_T("%f"),resultMax);
2490                         interfMainPanel::getInstance()->setCellValueInfoPanel(z, tmpIntA+3, tempString);
2491                         
2492                         tempString.Printf(_T("%f"),resultAverage);
2493                         interfMainPanel::getInstance()->setCellValueInfoPanel(z, tmpIntA+4, tempString);
2494                         
2495                         tempString.Printf(_T("%f"),resultStandardeviation);
2496                         interfMainPanel::getInstance()->setCellValueInfoPanel(z, tmpIntA+5, tempString);
2497                         
2498
2499                 } // for iContourGroup
2500         } // for z
2501
2502         int iTitleGroup;
2503         wxString tmpTitleString;
2504         int tmpIntB;
2505         for ( iTitleGroup=0 ; iTitleGroup<maxContourGroup ; iTitleGroup++ )
2506         {
2507                 tmpIntB =_numberOfVariablesStatistics*iTitleGroup;
2508                 tmpTitleString.Printf(_T("%d-Size Data"),iTitleGroup);
2509                 interfMainPanel::getInstance()->setColLableInfoPanel(tmpIntB + 0, tmpTitleString);
2510
2511                 interfMainPanel::getInstance()->setColLableInfoPanel(tmpIntB + 0, tmpTitleString );
2512                 interfMainPanel::getInstance()->setColLableInfoPanel( tmpIntB + 1, _T("Size Range") );
2513                 interfMainPanel::getInstance()->setColLableInfoPanel( tmpIntB + 2, _T("Min") );
2514                 interfMainPanel::getInstance()->setColLableInfoPanel( tmpIntB + 3, _T("Max") );
2515                 interfMainPanel::getInstance()->setColLableInfoPanel( tmpIntB + 4, _T("Average") );
2516                 interfMainPanel::getInstance()->setColLableInfoPanel( tmpIntB + 5, _T("St.Dev.") );
2517                 interfMainPanel::getInstance()->setColLableInfoPanel( tmpIntB + 6, _T(" ") );
2518         }
2519
2520         interfMainPanel::getInstance()->setStringInfoPanel( _T("") );
2521         delete contourextractdata;
2522 }
2523
2524 //AD: 29-05-09
2525 void wxContourMainFrame::onSaveResults(std::string directory,std::string namefile, std::string filename, 
2526         int typeContourGroup, bool XYZValues, bool contourImage, bool statistics)
2527 {
2528         if (XYZValues)
2529         {
2530                 SaveValuesXYZ( directory , namefile, typeContourGroup );
2531         }
2532
2533         if (contourImage)
2534         {
2535                 vtkImageData * mask;
2536                 vtkImageData * value;
2537                 this->getMaskValue(&mask, &value, typeContourGroup);
2538                 this->SaveImageResult( directory , namefile, mask, value);
2539         }
2540         
2541         if (statistics)
2542         {
2543                 std::ostringstream name;
2544                 name << filename << ".xls";
2545                 
2546
2547                 FILE *pFile=fopen(name.str().c_str(),"w+");
2548
2549                 int sizeZ = _theViewPanel->GetImageDataSizeZ();
2550
2551                 wxString tmpString;
2552                 int i,j,maxX,maxY=sizeZ;
2553                 maxX= interfMainPanel::getInstance()->getNumberColsInformationPanel();//this->_grid->GetNumberCols();
2554
2555                 int iTitle,sizeTitle = (maxX / _numberOfVariablesStatistics);
2556                 for ( iTitle=0; iTitle<sizeTitle ; iTitle++)
2557                 {
2558                                 // fprintf(pFile,"-- \t %d-Size \t SizeRange \t Min \t Max \t Ave \t StDv \t" , iTitle,tmpString.c_str() );
2559                                 fprintf(pFile,"-- \t %d-Size \t SizeRange \t Min \t Max \t Ave \t StDv \t" , iTitle );
2560                 }
2561                 fprintf(pFile,"\n" );
2562
2563
2564
2565                 for ( j=0; j<maxY ; j++)
2566                 {
2567                         fprintf(pFile,"%d\t" , j );
2568                         for (i=0 ; i<maxX ; i++){
2569                                 tmpString = interfMainPanel::getInstance()->getCellValue(j, i);//_grid->GetCellValue( j , i );
2570                                 fprintf(pFile,"%s\t" , (const char *)(tmpString.mb_str()) );
2571                         } // for i
2572                         fprintf(pFile,"\n"  );
2573                 } // for j
2574
2575                 fclose(pFile);
2576         }
2577 }
2578
2579 //AD: 29-05-09
2580 void wxContourMainFrame::SaveValuesXYZ(std::string directory,std::string namefile,int typeContourGroup)
2581 {
2582         wxBusyCursor wait;
2583         ContourExtractData      *contourextractdata = new ContourExtractData();
2584         //int typeContourGroup = this->_radiolstboxContourGroup->GetSelection();
2585         contourextractdata ->SetTypeOperation( typeContourGroup % 3 );
2586
2587         std::vector<manualContourModel*> lstManConMod;
2588         std::vector<manualContourModel*> lstManConModTmp;
2589         std::vector<manualContourModel*> lstManConModExp;
2590         std::vector<double> pLstValue;
2591         std::vector<double> pLstValuePosX;
2592         std::vector<double> pLstValuePosY;
2593         std::vector<double> pLstValuePosZ;
2594
2595         std::vector<int> tempVector;
2596         _instantPanel->getInstant( tempVector );
2597
2598         vtkImageData *imagedata = _theViewPanel->getSceneManager()->GetImageData();
2599         int sizeZ = _theViewPanel->getSceneManager()->GetImageDataSizeZ();
2600         int z;
2601         int ii,sizeLstContourThings;
2602
2603
2604         int minZ,maxZ;
2605         double totalZ;
2606         double porcent; 
2607         wxString tmpString;
2608         minZ    = 0;// _mbarrange->GetStart();
2609         maxZ    = sizeZ;//_mbarrange->GetEnd();
2610         totalZ  = maxZ-minZ+1;
2611
2612         contourextractdata->SetImage( imagedata);
2613
2614 // For each slice..
2615         for ( z=0 ; z<sizeZ ; z++)
2616         {
2617
2618                 porcent = 100.0* (z-minZ)/totalZ;
2619                 
2620                 tmpString.Printf(_T("Saving Values"));
2621                 tmpString.Printf(_T("  %d %c            %d/%d             %d"), (int)porcent , 37 , z-minZ+1, (int)totalZ ,z);
2622                 interfMainPanel::getInstance()->setStringInfoPanel(tmpString);
2623                 //_staticTextInformation->SetLabel(tmpString);
2624
2625
2626                 //Extraction data from contours of each slice
2627                 contourextractdata->SetZtoBeAnalys( z);
2628
2629                 tempVector[1]=z;
2630                 Instant instant(&tempVector);
2631                 std::vector<ContourThing**> lstContourThings = kernelManager->getOutlinesAtInstant(&instant);//this->_modelManager->getOutlinesAtInstant( &instant );
2632                 sizeLstContourThings = lstContourThings.size();
2633
2634                 lstManConMod.clear();
2635                 for (ii=0 ; ii<sizeLstContourThings ; ii++)
2636                 {
2637                         ContourThing **contourthing = lstContourThings[ii];
2638                         lstManConMod.push_back( (*contourthing)->getModel() );
2639                 }
2640                 lstManConModExp =  kernelManager->ExploseEachModel( lstManConMod );
2641
2642
2643 //EED004
2644
2645                 int iContourGroup,sizeContourGroup;
2646                 if (typeContourGroup==3) // contour separete
2647                 {
2648                         sizeContourGroup=lstManConModExp.size();
2649                 } else {  // contour AND OR XOR
2650                         sizeContourGroup=1;
2651                 }
2652
2653                 for( iContourGroup=0 ; iContourGroup<sizeContourGroup ; iContourGroup++ ){
2654                         lstManConModTmp.clear();
2655                         if (typeContourGroup==3) // contour separete
2656                         {
2657                                 lstManConModTmp.push_back( lstManConModExp[iContourGroup]);
2658                         } else {  // contour AND OR XOR
2659                                 lstManConModTmp = lstManConModExp;
2660                         }
2661
2662                         contourextractdata->SetLstManualContourModel( lstManConModTmp );
2663
2664                         pLstValue.clear();
2665                         pLstValuePosX.clear();
2666                         pLstValuePosY.clear();
2667                         pLstValuePosZ.clear();
2668                         contourextractdata->GetValuesInsideCrown(       &pLstValue,
2669                                                                                                                 &pLstValuePosX,
2670                                                                                                                 &pLstValuePosY,
2671                                                                                                                 &pLstValuePosZ);
2672
2673                         std::string temp = directory + "/" + namefile + "-slice";
2674                         temp = temp + kernelManager->intToString(z) + "-cont" + kernelManager->intToString(iContourGroup);
2675                         temp = temp + ".txt";
2676
2677                         // LG 14/01/09 : using crea
2678                         wxString filename = crea::std2wx(temp);
2679                         /*filename.Printf(_T("%s"),directory.c_str());
2680                         filename.append(_T("\\"));
2681                         filename.append(_T("%s"),namefile.c_str());
2682                         filename.append(_T("-slice"));
2683                         filename.append(_T("%d"),z);
2684                         filename.append(_T("-cont"));
2685                         filename.append(_T("%d"),iContourGroup);
2686                         filename.append(_T(".txt"));*/
2687                         //                      filename.Printf(temp.c_str());
2688
2689                         
2690
2691                         FILE *pFile=fopen((const char *)filename.mb_str(),"w+");
2692                         fprintf(pFile,"value \t x \t y \t z\n"  );
2693                         int iLstValue,sizeLstValue=pLstValue.size();
2694                         for (iLstValue=0 ; iLstValue<sizeLstValue ; iLstValue++ )
2695                         {
2696                                 fprintf(pFile,"%f\t %f\t %f\t %f\n", (float)pLstValue[iLstValue] , (float)pLstValuePosX[iLstValue], (float)pLstValuePosY[iLstValue], (float)z );
2697                         }
2698                         fclose(pFile);
2699                 } // for  iContourGroup
2700         } // for z
2701         interfMainPanel::getInstance()->setStringInfoPanel(_T(""));
2702         //_staticTextInformation->SetLabel( _T("") );
2703         delete contourextractdata;
2704 }
2705
2706 void wxContourMainFrame::getMaskValue(vtkImageData ** mask,vtkImageData ** value,int typeContourGroup){
2707         wxBusyCursor wait;
2708         ContourExtractData      *contourextractdata = new ContourExtractData( true );
2709         //int typeContourGroup = this->_radiolstboxContourGroup->GetSelection();
2710         if (typeContourGroup==3)
2711         {
2712                 typeContourGroup=1;
2713         }
2714         contourextractdata ->SetTypeOperation( typeContourGroup % 3 );
2715
2716         std::vector<manualContourModel*> lstManConMod;
2717         std::vector<manualContourModel*> lstManConModTmp;
2718         std::vector<manualContourModel*> lstManConModExp;
2719
2720         std::vector<int> tempVector;
2721         _instantPanel->getInstant( tempVector );
2722
2723         vtkImageData *imagedata = _theViewPanel->getImageData();
2724         int sizeZ = _theViewPanel->GetImageDataSizeZ();
2725         int z;
2726         int ii,sizeLstContourThings;
2727
2728
2729         int minZ,maxZ;
2730         double totalZ;
2731         double porcent; 
2732
2733         wxString tmpString;
2734
2735         minZ    = 0;// _mbarrange->GetStart();
2736         maxZ    = sizeZ;//_mbarrange->GetEnd();
2737         totalZ  = maxZ-minZ+1;
2738
2739         contourextractdata->SetImage( imagedata);
2740
2741 // For each slice..
2742         for ( z=0 ; z<sizeZ ; z++)
2743         {
2744
2745                 porcent = 100.0* (z-minZ)/totalZ;
2746                 tmpString.Printf(_T("Saving Values"));
2747                 tmpString.Printf(_T("%d %c            %d/%d             %d"), (int)porcent , 37 , z-minZ+1, (int)totalZ ,z);
2748                 interfMainPanel::getInstance()->setStringInfoPanel(tmpString);
2749
2750                 //Extraction data from contours of each slice
2751                 contourextractdata->SetZtoBeAnalys( z);
2752
2753                 tempVector[1]=z;
2754                 Instant instant(&tempVector);
2755                 std::vector<ContourThing**> lstContourThings = kernelManager->getOutlinesAtInstant( &instant );
2756                 sizeLstContourThings = lstContourThings.size();
2757
2758                 lstManConMod.clear();
2759                 for (ii=0 ; ii<sizeLstContourThings ; ii++)
2760                 {
2761                         ContourThing **contourthing = lstContourThings[ii];
2762                         lstManConMod.push_back( (*contourthing)->getModel() );
2763                 }
2764                 lstManConModExp =  kernelManager->ExploseEachModel( lstManConMod );
2765
2766
2767                 int iContourGroup,sizeContourGroup;
2768                 if (typeContourGroup==3) // contour separete
2769                 {
2770                         sizeContourGroup=lstManConModExp.size();
2771                 } else {  // contour AND OR XOR
2772                         sizeContourGroup=1;
2773                 }
2774
2775                 for( iContourGroup=0 ; iContourGroup<sizeContourGroup ; iContourGroup++ ){
2776                         lstManConModTmp.clear();
2777                         if (typeContourGroup==3) // contour separete
2778                         {
2779                                 lstManConModTmp.push_back( lstManConModExp[iContourGroup]);
2780                         } else {  // contour AND OR XOR
2781                                 lstManConModTmp = lstManConModExp;
2782                         }
2783
2784                         contourextractdata->SetLstManualContourModel( lstManConModTmp );
2785                         contourextractdata->CalculateImageResult(); // with actual Z
2786
2787                 } // for  iContourGroup
2788         } // for z
2789
2790         (*value) = contourextractdata->GetVtkImageValueResult();
2791         (*mask) = contourextractdata->GetVtkImageMaskResult();
2792         delete contourextractdata;
2793 }
2794
2795 void wxContourMainFrame::SaveImageResult(std::string directory,std::string namefile, vtkImageData* mask,vtkImageData* value)
2796 {
2797         
2798         std::string temp = directory + "/" + namefile + "-Value.mhd";
2799
2800         wxString filename = crea::std2wx(temp);
2801         // LG 
2802         //      filename.Printf(_T(temp.c_str()));
2803         //filename.Printf(_T("%s\\%s-Value.mhd",directory.c_str(),namefile.c_str(),z);
2804         /*filename.Printf(_T("%s"),directory.c_str());
2805         filename.append(_T("\\"));
2806         filename.append(_T("%s"),namefile.c_str());
2807         filename.append(_T("-Value.mhd"));*/
2808
2809 // Image Value
2810         vtkMetaImageWriter *writerValueImage = vtkMetaImageWriter::New( );
2811         writerValueImage->SetInput( value );
2812         writerValueImage->SetFileName( (const char *)filename.mb_str() );
2813         writerValueImage->SetFileDimensionality( 3 );
2814         writerValueImage->Write( );
2815
2816 // Image Mask
2817         //              filename.Printf("%s\\%s-Mask.mhd",directory.c_str(),namefile.c_str(),z);
2818         temp = directory + "/" + namefile + "-Mask.mhd";
2819
2820         // LG 14/01/09 : using crea
2821         filename = crea::std2wx(temp);
2822         //      filename.Printf(_T(temp.c_str()));
2823
2824         /*filename.Printf(_T("%s"),directory.c_str());
2825         filename.append(_T("\\"));
2826         filename.append(_T("%s"),namefile.c_str());
2827         filename.append(_T("-Mask.mhd"));*/
2828
2829         vtkMetaImageWriter *writerMaskImage = vtkMetaImageWriter::New( );
2830         writerMaskImage->SetInput( mask );
2831         writerMaskImage->SetFileName( (const char *)filename.mb_str() );
2832         writerMaskImage->SetFileDimensionality( 3 );
2833         writerMaskImage->Write( );
2834
2835         interfMainPanel::getInstance()->setStringInfoPanel( _T("") );
2836         
2837 }
2838
2839
2840
2841 void wxContourMainFrame::onChangeInstantInstantPanel(std::string name,int value, int minshow, int maxshow){
2842         if( name.compare( _theViewPanel->getVerticalConceptName() ) == 0){
2843                 _theViewPanel->setActualVertical( value);
2844         }
2845         else if( name.compare( _theViewPanel->getHorizontalConceptName() ) == 0|| _instantPanel->getIfConceptCheckedAt( name, 0 ) )     {
2846                 _theViewPanel->setHorizontalConcept( name, minshow, maxshow, minshow, maxshow, value);
2847         }
2848
2849         changeInstant();
2850 }
2851
2852 void wxContourMainFrame::onSnakePressed(){
2853         std::vector<double> vecX; 
2854         std::vector<double> vecY; 
2855         std::vector<double> vecZ; 
2856         _theViewPanel->GetPointsOfActualContour( &vecX , &vecY , &vecZ );       
2857
2858         if (vecX.size()!=0){
2859                 std::vector<int> tempVector;
2860                 _instantPanel->getInstant( tempVector );
2861                 int i,size=vecZ.size();
2862                 int actualSlice = tempVector[1];
2863                 for ( i=0 ; i<size ; i++ )
2864                 {
2865                         vecZ[i] = actualSlice;
2866                 } // for
2867
2868                 wxDialog* dialog = new wxDialog(this, -1, wxString(_T("Snake")));
2869                 wxPanel* panel = new wxPanel(dialog,-1); 
2870                 //              wxStaticText* sttext = new wxStaticText(panel, -1, wxString(_T("Panel para snake")));
2871          new wxStaticText(panel, -1, wxString(_T("Panel para snake")));
2872                 dialog->ShowModal();
2873         } // if 
2874
2875 }
2876
2877 void wxContourMainFrame::saveFileWithContoursAutomatique(){
2878         std::string filename = kernelManager->getCurrentFileName();
2879         if(filename.compare("")!=0){
2880                 saveFileWithContours(filename);
2881         }else{
2882                 onSave();
2883         }
2884 }
2885 void wxContourMainFrame::ShowToolsPanel(bool show){
2886         _pannew->Show(show);
2887 }
2888