From: caballero Date: Thu, 26 Feb 2009 15:52:19 +0000 (+0000) Subject: Changed validation methods from TreeView to GimmickView (Abstract) X-Git-Tag: EED.02Oct2009~162 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=403cc3cf787a717b7a9cdf2d148758a66dbdce27;p=creaImageIO.git Changed validation methods from TreeView to GimmickView (Abstract) Implemented obtention of images in GimmickView(Abstract) --- diff --git a/appli/TestWxGimmickReaderDialog/main.cxx b/appli/TestWxGimmickReaderDialog/main.cxx index 9c9c164..5d4a335 100644 --- a/appli/TestWxGimmickReaderDialog/main.cxx +++ b/appli/TestWxGimmickReaderDialog/main.cxx @@ -41,7 +41,7 @@ bool myApp::OnInit( ) wxSize(1200,800), min_dim, max_dim, - // output_dim, + output_dim, threads); w.ShowModal(); @@ -49,6 +49,7 @@ bool myApp::OnInit( ) { std::cout << "$$$$ main : user clicked 'OK' $$$$"< s; w.GetSelectedFiles(s); std::vector::iterator i; @@ -58,8 +59,10 @@ bool myApp::OnInit( ) } std::cout << "$$$$ "< images; - w.GetSelectedImages(images,3); + w.GetSelectedImages(images,output_dim); + crea::VtkBasicSlicer(images.front()); images.front()->Delete(); diff --git a/src2/creaImageIOGimmickView.cpp b/src2/creaImageIOGimmickView.cpp index 3e958f5..49297e9 100644 --- a/src2/creaImageIOGimmickView.cpp +++ b/src2/creaImageIOGimmickView.cpp @@ -5,11 +5,14 @@ namespace creaImageIO { //====================================================================== // CTor - GimmickView::GimmickView(Gimmick* gimmick) - : mGimmick(gimmick) + GimmickView::GimmickView(Gimmick* gimmick, int threads) + : mGimmick(gimmick), + mReader(threads) { GimmickDebugMessage(1,"GimmickView::GimmickView" <second->UpdateLevel(l); } //====================================================================== + ///Validates the dimension compliance of the images with the maximum and + ///minimum given, and between their sizes + bool GimmickView::ValidateSelected (std::vector& sel, int min_dim, int max_dim) + { + GimmickMessage(2,"Validating selected"<0) + { + std::vector::iterator i; + std::string row; + std::string col; + std::string plane; + + //Validation between image sizes + for (i=sel.begin(); i!=sel.end() && valid; ++i) + { + if(i==sel.begin()) + { + row=(*i)->GetAttribute("D0028_0010"); + col=(*i)->GetAttribute("D0028_0011"); + plane=(*i)->GetAttribute("D0028_0012"); + level=(*i)->GetLevel(); + + } + else + { + if(((*i)->GetAttribute("D0028_0010"))!=row || + ((*i)->GetAttribute("D0028_0011"))!=col || + ((*i)->GetAttribute("D0028_0012"))!=plane) + { + mMessage="The selected images are not compatible."; + valid=false; + } + } + } + + //Dimention validation + //Compatibility with maximum + if(valid) + { + + int rows; + int cols; + int planes; + std::string s; + std::istringstream t(s); + s=row; + t >> rows; + if(row==""){rows=1;} + s=col; + t >> cols; + if(col==""){cols=1;} + s=plane; + t >> planes; + if(plane==""){planes=1;} + + int dim = 0; + if (planes>1) dim=3; + else if (cols>1) dim=2; + else if (rows>1) dim=1; + + if (dim == 0) + { + mMessage="Unknown image dimension : cannot select !"; + valid= false; + } + else if (dim>max_dim) + { + mMessage="Selecting "; + mMessage+=dim; + mMessage+="D images is not allowed !"; + valid= false; + } + if ( dim == max_dim ) + { + mMessage="Cannot add this image to selection : would result in a "; + mMessage+=(dim+1); + mMessage+="D image!"; + + valid= false; + } + if ( dim < min_dim && sel.size()<2 ) + { + GimmickDebugMessage(2, "State Check: Dim: " + <& s,std::vector im, int dimension) + { + + // Create the output data + if (im.size()==1) + { + + // Only one image : give it + vtkImageData* out = vtkImageData::New(); + GimmickMessage(1, "State Check: Full Filename: " + <GetAttribute("FullFileName") + <ShallowCopy(mReader.GetImage(im.front()->GetAttribute("FullFileName"))); + s.push_back( out ); + } + + else if (im.size()>1) + { + vtkImageData* first = mReader.GetImage( im.front()->GetAttribute("FullFileName")); + if (dimension==2) + { + // n2D to 3D + vtkImageData* out = vtkImageData::New(); + out->CopyStructure(first); + out->SetScalarType(first->GetScalarType()); + int ext[6]; + first->GetExtent(ext); + ext[5] = im.size(); + out->SetExtent(ext); + // LG : TODO : Z Spacing ? + + out->AllocateScalars(); + + //first->Print(std::cout); + // out->Print(std::cout); + + int dim[3]; + first->GetDimensions(dim); + unsigned long imsize = + ( (unsigned long)first->GetScalarPointer(0,1,0) + - (unsigned long)first->GetScalarPointer(0,0,0)) + *dim[1]; + + int slice = 0; + std::vector::iterator it; + for (it=im.begin(); it!=im.end(); ++it) + { + //std::cout << "copying slice "<GetAttribute("FullFileName")); + + void* src = cur->GetScalarPointer(0,0,0); + void* dst = out->GetScalarPointer(0,0,slice); + // std::cout << "src="< #include +#include #define GIMMICK_NO_IMAGE_SELECTION 0 #define GIMMICK_2D_IMAGE_SELECTION 2 @@ -27,11 +28,11 @@ namespace creaImageIO //===================================================================== ///Abstract class that handles views, attributes and previews (GUI) for Gimmick. - class GimmickView + class GimmickView: public MultiThreadImageReaderUser { public: /// Ctor - GimmickView(Gimmick* ); + GimmickView(Gimmick*, int number_of_threads = 0 ); /// Virtual destructor virtual ~GimmickView(); @@ -53,12 +54,26 @@ namespace creaImageIO /// Finalize virtual void Finalize(); + ///Returns the selected Images and validates to see if they comply with the given parameter(<4D) vtkImageData* GetSelectedImage(int dim); ///Adds the selected Images to the given vector and validates to see if they comply with the given parameter (4D) - virtual void GetSelectedImages(std::vector& s, int dim) {} + virtual void GetSelectedImages(std::vector& s, int dim) + { GimmickError("INTERNAL ERROR : GetSelectedImages not implemented"); } + + virtual void GetSelectedFiles(std::vector& s) + { GimmickError("INTERNAL ERROR : GetSelectedFiles not implemented"); } + + ///Validates the dimension compliance of the images with the maximum and minimum given, and between their sizes + bool ValidateSelected (std::vector& sel, int min_dim, int max_dim); + + ///Reads the vector of nodes, builds images in the dimension required and returns them in the supplied vector. + void ReadImagesNotThreaded(std::vector& s,std::vector im, int dim); - virtual void GetSelectedFiles(std::vector& s) {} + ///Obtains the message of the state + std::string GetMessage(){return mMess;} + ///Obtains the message of the state + void SetMessage(std::string mess){mMess=mess;} /// Create the tree views void CreateTreeViews(); @@ -76,6 +91,11 @@ namespace creaImageIO Gimmick* mGimmick; /// The views TreeViewMapType mTreeViewMap; + /// The message that results from the validation + std::string mMess; + /// Multi-thread image reader + MultiThreadImageReader mReader; + }; // EO class GimmickView diff --git a/src2/creaImageIOTreeView.h b/src2/creaImageIOTreeView.h index 4f61518..4434789 100644 --- a/src2/creaImageIOTreeView.h +++ b/src2/creaImageIOTreeView.h @@ -35,32 +35,21 @@ namespace creaImageIO ///Validates the selected images virtual void ValidateSelectedImages() { GimmickError("INTERNAL ERROR : TreeView::ValidateSelected not overloaded");} - ///Returns the selected data as vtkImageData - vtkImageData* GetSelectedImage(int dim) - { GimmickError("INTERNAL ERROR : TreeView::GetSelectedImage not overloaded");} - ///Returns the selected data as a vector of vtkImageData (4D) - virtual void GetSelectedImages(std::vector& s, int dim) - { GimmickError("INTERNAL ERROR : TreeView::GetSelectedImages not overloaded");} - - ///Sets the maximum dimension allowed for selections - void SetMaxDimension(int maxdim){ mSelectionMaxDimension=maxdim; } - ///Sets the minimum dimension allowed for selections - void SetMinDimension(int mindim){ mSelectionMinDimension=mindim; } + ///Returns the maximum number of levels + virtual int GetNumberOfLevels(){ GimmickError("INTERNAL ERROR : TreeView::GetLevels not overloaded"); } + ///Gets the current selections filenames + virtual void GetSelectedAsString(std::vector&s){ GimmickError("INTERNAL ERROR : TreeView::GetSelectedAsString not overloaded"); } + + /// Gets the user selected data from the level passed as a parameter + virtual std::vector GetSelected(int level){ GimmickError("INTERNAL ERROR : TreeView::GetSelected not overloaded"); } + protected: TreeHandler* GetTreeHandler() { return mTreeHandler; } - ///Gets the maximum dimension allowed for selections - int GetMaxDimension(){ return mSelectionMaxDimension; } - ///Gets the minimum dimension allowed for selections - int GetMinDimension(){ return mSelectionMinDimension; } private: /// The TreeHandler with which it corresponds TreeHandler* mTreeHandler; - //The selection's maximum dimension - int mSelectionMaxDimension; - //The selection's minimum dimension - int mSelectionMinDimension; }; // EO class TreeView //===================================================================== diff --git a/src2/creaImageIOWxGimmickReaderDialog.cpp b/src2/creaImageIOWxGimmickReaderDialog.cpp index 44543b3..d223e2c 100644 --- a/src2/creaImageIOWxGimmickReaderDialog.cpp +++ b/src2/creaImageIOWxGimmickReaderDialog.cpp @@ -87,15 +87,13 @@ namespace creaImageIO ///Callback method on a selection void WxGimmickReaderDialog::OnValid(wxCommandEvent& event) { - mView->SetMessage(event.GetString()); - if (event.GetInt()==0) - {mOkButton->Enable(true);} - else - {mOkButton->Enable(false);} + bool t=mView->ValidateSelection(event.GetClientData()); + mOkButton->Enable(t); } - + + //================================================================ BEGIN_EVENT_TABLE(WxGimmickReaderDialog, wxDialog) EVT_COMMAND(wxID_ANY, 0, WxGimmickReaderDialog::OnValid) diff --git a/src2/creaImageIOWxGimmickView.cpp b/src2/creaImageIOWxGimmickView.cpp index 7594cbe..5e851a3 100644 --- a/src2/creaImageIOWxGimmickView.cpp +++ b/src2/creaImageIOWxGimmickView.cpp @@ -65,7 +65,7 @@ namespace creaImageIO int max_dim, int number_of_threads) : wxPanel(parent,id,pos,size), - GimmickView(gimmick), + GimmickView(gimmick, number_of_threads), mProgressDialog(0) { GimmickDebugMessage(1,"WxGimmickView::WxGimmickView" @@ -99,8 +99,8 @@ namespace creaImageIO //Gimmick mGimmick=gimmick; - mSelectionMaxDimension=max_dim; - mSelectionMinDimension=min_dim; + mSelectionMaxDimension= max_dim; + mSelectionMinDimension= min_dim; // Create the views CreateTreeViews(); @@ -111,7 +111,7 @@ namespace creaImageIO // Splitting int hsize = size.GetHeight(); - int bottom_minsize = 20; + int bottom_minsize = 15; mSplitter->SetMinimumPaneSize( bottom_minsize ); mSplitter->SplitHorizontally( mNotebook, mBottomPanel, @@ -185,9 +185,6 @@ namespace creaImageIO name<<"'"<SetMaxDimension(mSelectionMaxDimension); - view->SetMinDimension(mSelectionMinDimension); // TO DO : TEST THAT A VIEW WITH SAME NAME IS NOT // ALREADY IN THE MAP @@ -201,16 +198,24 @@ namespace creaImageIO /// Returns the selected Image so that it complies with the given parameter(<4D) vtkImageData* WxGimmickView::GetSelectedImage(int dim) { - return GetTreeViewMap()["Local database"]->GetSelectedImage(dim); + return NULL; + //GetTreeViewMap()["Local database"]->GetSelectedImage(dim); } //====================================================================== /// Returns the selected Images so that they comply with the given parameter(4D) void WxGimmickView::GetSelectedImages(std::vector& s, int dim) { - GetTreeViewMap()["Local database"]->GetSelectedImages(s,dim); + int level=GetTreeViewMap()["Local database"]->GetNumberOfLevels(); + std::vector im=GetTreeViewMap()["Local database"]->GetSelected(level+1); + ReadImagesNotThreaded(s,im,dim); + } + //====================================================================== + /// Returns the selected Images so that they comply with the given parameter(4D) + void WxGimmickView::GetSelectedFiles(std::vector& s) + { + GetTreeViewMap()["Local database"]->GetSelectedAsString(s); } - //================================================= void WxGimmickView::CreateIconList() { @@ -348,11 +353,14 @@ namespace creaImageIO //================================================= //================================================= - void WxGimmickView::SetMessage(const wxString& mess) + bool WxGimmickView::ValidateSelection(void * s) { wxBusyCursor busy; + std::vector sel=* (std::vector *) s; + bool valid=ValidateSelected(sel,mSelectionMinDimension,mSelectionMaxDimension ); + mText->SetLabel(_T("Status: ")+GetMessage()); + return valid; - mText->SetLabel(_T("Status: ")+mess); } //================================================= @@ -413,6 +421,7 @@ namespace creaImageIO */ wxMessageBox(std2wx(mess.str()),_T("Addition result"),wxOK,this); } + //================================================= //================================================= diff --git a/src2/creaImageIOWxGimmickView.h b/src2/creaImageIOWxGimmickView.h index bc5eaf1..a156b16 100644 --- a/src2/creaImageIOWxGimmickView.h +++ b/src2/creaImageIOWxGimmickView.h @@ -39,11 +39,14 @@ namespace creaImageIO /// Returns the selected Images so that they comply with the given parameter(<4D) ///(overloaded from GimmickView) vtkImageData* GetSelectedImage(int dim); + /// Returns the selected files + ///(overloaded from GimmickView) + void GetSelectedFiles(std::vector& s); /// Returns the selected Images so that they comply with the given parameter(4D) //(overloaded from GimmickView) void GetSelectedImages(std::vector& s, int dim); - /// Sets the message state - void SetMessage(const wxString& mess); + /// Validates the selected images + bool ValidateSelection(void *); protected: /// Creates the tool bar @@ -79,6 +82,7 @@ namespace creaImageIO void OnAddDir(wxCommandEvent& event); /// Callback for removing files void OnRemove(wxCommandEvent& event); + /// Display a message box with the last addition statistics void DisplayAddSummary(); @@ -88,9 +92,9 @@ namespace creaImageIO /// Progress dialog wxProgressDialog* mProgressDialog; - //The selection's maximum dimension + ///The selection's maximum dimension int mSelectionMaxDimension; - //The selection's minimum dimension + ///The selection's minimum dimension int mSelectionMinDimension; diff --git a/src2/creaImageIOWxTreeView.cpp b/src2/creaImageIOWxTreeView.cpp index c818958..d34741c 100644 --- a/src2/creaImageIOWxTreeView.cpp +++ b/src2/creaImageIOWxTreeView.cpp @@ -287,7 +287,7 @@ namespace creaImageIO for (int k=1; kGetColumnCount(); k++) { - + std::string val = (*j)->GetAttribute(mLevelList[l].key[k-1]); if (val.size()==0) val = "?"; item.SetText( crea::std2wx(val)); @@ -459,196 +459,27 @@ namespace creaImageIO void WxTreeView::ValidateSelectedImages() { - int level=mLevelList.size(); - std::vector sel=GetSelected(level+1); - bool valid=true; - std::string mess; - if(sel.size()>0) - { - std::vector::iterator i; - std::string row; - std::string col; - std::string plane; - - - //Validation between image sizes - for (i=sel.begin(); i!=sel.end() && valid; ++i) - { - if(i==sel.begin()) - { - row=(*i)->GetAttribute(mLevelList[level-1].key[1]); - col=(*i)->GetAttribute(mLevelList[level-1].key[2]); - plane=(*i)->GetAttribute(mLevelList[level-1].key[3]); - } - else - { - if(((*i)->GetAttribute(mLevelList[level-1].key[1]))!=row || - ((*i)->GetAttribute(mLevelList[level-1].key[2]))!=col || - ((*i)->GetAttribute(mLevelList[level-1].key[3]))!=plane) - { - mess="The selected images are not compatible."; - valid=false; - } - } - } - - //Dimention validation - //Compatibility with maximum - if(valid) - { - - int rows; - int cols; - int planes; - std::string s; - std::istringstream t(s); - s=row; - t >> rows; - if(row==""){rows=1;} - s=col; - t >> cols; - if(col==""){cols=1;} - s=plane; - t >> planes; - if(plane==""){planes=1;} - - int dim = 0; - if (planes>1) dim=3; - else if (cols>1) dim=2; - else if (rows>1) dim=1; - - if (dim == 0) - { - mess="Unknown image dimension : cannot select !"; - valid= false; - } - else if (dim>GetMaxDimension()) - { - mess="Selecting "; - mess+=dim; - mess+="D images is not allowed !"; - valid= false; - } - if ( dim == GetMaxDimension() ) - { - mess="Cannot add this image to selection : would result in a "; - mess+=(dim+1); - mess+="D image!"; - - valid= false; - } - if ( dim < GetMinDimension() && sel.size()<2 ) - { - mess="Cannot build the selection as it would result in a "; - mess+=dim; - mess+="D image, and the minimum is "; - mess+=GetMinDimension(); - mess+="D!"; - valid= false; - } - } - } - else - { - mess="Cannot have 0 images selected"; - valid=false; - } - //Send an event telling wether the selection is valid or not wxCommandEvent event( 0, GetId() ); event.SetEventObject( this ); - if(valid) - { - mess="Selection OK !"; - event.SetInt(0); - } - else - {event.SetInt(1);} - event.SetString(crea::std2wx(mess)); + std::vector sel=GetSelected((mLevelList.size()+1)); + event.SetClientData(&sel); GetEventHandler()->ProcessEvent( event ); - - } - //================================================================ - vtkImageData* WxTreeView::GetSelectedImage(int dim) - { - - return NULL; - } - - void WxTreeView::GetSelectedImages(std::vector& f, int dim) + void WxTreeView::GetSelectedAsString(std::vector&s) { - /* - std::vector im=GetSelected(level+1); + int level=mLevelList.size(); + std::vector sel=GetSelected(level+1); + std::vector::iterator i; - // Create the output data - if (im.size()==1) - { - // Only one image : give it - vtkImageData* out = vtkImageData::New(); - out->ShallowCopy(mReader.GetImage(im.front()->ImageGetFullFileName())); - f.push_back( out ); - } - else if (im.size()>1) + for (i=sel.begin(); i!=sel.end(); ++i) { - vtkImageData* first = mReader.GetImage( im.front()->ImageGetFullFileName() ); - if (first->GetDataDimension()==2) - { - // n2D to 3D - vtkImageData* out = vtkImageData::New(); - out->CopyStructure(first); - out->SetScalarType(first->GetScalarType()); - int ext[6]; - first->GetExtent(ext); - ext[5] = im.size(); - out->SetExtent(ext); - // LG : TODO : Z Spacing ? - - out->AllocateScalars(); - - //first->Print(std::cout); - // out->Print(std::cout); - - int dim[3]; - first->GetDimensions(dim); - unsigned long imsize = - ( (unsigned long)first->GetScalarPointer(0,1,0) - - (unsigned long)first->GetScalarPointer(0,0,0)) - *dim[1]; - - int slice = 0; - std::vector::iterator it; - for (it=im.begin(); it!=im.end(); ++it) - { - //std::cout << "copying slice "<ImageGetFullFileName() ); - - void* src = cur->GetScalarPointer(0,0,0); - void* dst = out->GetScalarPointer(0,0,slice); - // std::cout << "src="<::iterator it; - for (it=im.begin(); it!=im.end(); ++it) - { - vtkImageData* out = vtkImageData::New(); - out->ShallowCopy(mReader.GetImage((*it)->ImageGetFullFileName())); - f.push_back(out); - } - } - } - */ } + //================================================================ BEGIN_EVENT_TABLE(WxTreeView, wxPanel) /* EVT_SIZE(MyFrame::OnSize) diff --git a/src2/creaImageIOWxTreeView.h b/src2/creaImageIOWxTreeView.h index 3571c11..ba0dae2 100644 --- a/src2/creaImageIOWxTreeView.h +++ b/src2/creaImageIOWxTreeView.h @@ -58,15 +58,14 @@ namespace creaImageIO wxListCtrl* GetCtrl(int l) { return mLevelList[l].wxCtrl; } /// return the wxSplitter of one level wxSplitterWindow* GetSplitter(int l) { return mLevelList[l].wxSplitter; } + //Returns the maximum number of levels + int GetNumberOfLevels(){ return mLevelList.size(); } /// Gets the user selected data from the level passed as a parameter std::vector GetSelected(int level); ///Validates the selected images - void ValidateSelectedImages(); - ///Returns the selected data as vtkImageData - vtkImageData* GetSelectedImage(int dim); - ///Returns the selected data as vtkImageData - void GetSelectedImages(std::vector& s, int dim); - + void ValidateSelectedImages(); + ///Gets selected filenames + void GetSelectedAsString(std::vector&s); // Updates the view of a level given the selected items of upper level // Recursive method virtual void RecursiveUpdateLevel( int );