From 1bc65575c477b90bac7c4b02869e40a0d9fb11b0 Mon Sep 17 00:00:00 2001 From: guigues Date: Mon, 9 Mar 2009 13:55:15 +0000 Subject: [PATCH] *** empty log message *** --- src2/creaImageIOGimmickView.cpp | 24 ++- src2/creaImageIOGimmickView.h | 98 ++++++---- src2/creaImageIORFImageReader.cpp | 2 +- src2/creaImageIOWxGimmickView.cpp | 100 +++++++--- src2/creaImageIOWxViewer.cpp | 314 +++++++++++++----------------- src2/creaImageIOWxViewer.h | 57 ++++-- 6 files changed, 309 insertions(+), 286 deletions(-) diff --git a/src2/creaImageIOGimmickView.cpp b/src2/creaImageIOGimmickView.cpp index a587a8d..ca9113c 100644 --- a/src2/creaImageIOGimmickView.cpp +++ b/src2/creaImageIOGimmickView.cpp @@ -269,8 +269,17 @@ namespace creaImageIO } } + //====================================================================== - + //====================================================================== + ///Requests the reading of an image + void GimmickView::RequestReading(tree::Node* n, + int prio, int selection_index) + { + ImageEventType t(n,0,selection_index); + mImageEventMap[n->GetAttribute("FullFileName")] = t; + mReader.Request(this,n->GetAttribute("FullFileName"),prio); + } //====================================================================== //====================================================================== @@ -289,14 +298,17 @@ namespace creaImageIO mImageEventQueue.push_back(ImageEventType(image)); return; } - std::map::iterator i; - i = mImageFileNameToNode.find(filename); - if (i!=mImageFileNameToNode.end()) + ImageEventTypeMap::iterator i; + i = mImageEventMap.find(filename); + if (i!=mImageEventMap.end()) { GimmickDebugMessage(5, - "Pushing image of file '"<second<<"' in queue" + "Pushing image of file '"<second,image)); + ImageEventType e(i->second); + e.image = image; + mImageEventQueue.push_back(e); + mImageEventMap.erase(i); } } diff --git a/src2/creaImageIOGimmickView.h b/src2/creaImageIOGimmickView.h index f2baa23..2687d38 100644 --- a/src2/creaImageIOGimmickView.h +++ b/src2/creaImageIOGimmickView.h @@ -66,36 +66,38 @@ namespace creaImageIO 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"); } - virtual void OnSelectionChange(std::vector& s) - { GimmickError("INTERNAL ERROR : OnSelectionChange 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); - ///Requests the reading of an image - void RequestReading(tree::Node* n, int prio){mReader.Request(this,n->GetAttribute("FullFileName"),prio);} - ///Adds an entry to the filename to node map - void AddEntryToMap(tree::Node* node){mImageFileNameToNode[node->GetAttribute("FullFileName")] = node;} - ///Returns true if the ImageEventQueue is empty - bool IsQueueEmpty(){return mImageEventQueue.empty();} - ///Clears the queue - void ClearQueue(){mImageEventQueue.clear();} - ///Returns the next in line EventType's image - vtkImageData* GetNextImageQueued(){return mImageEventQueue.front().image;} - ///Returns the next in line EventType's node - tree::Node* GetNextNodeQueued(){return mImageEventQueue.front().node;} - ///Unqueus the next in line EventType - void UnqueueNext(){mImageEventQueue.pop_front();} - - - ///Obtains the message of the state - std::string GetMessage(){return mMess;} - ///Obtains the message of the state - void SetMessage(std::string mess){mMess=mess;} + virtual void GetSelectedFiles(std::vector& s) + { GimmickError("INTERNAL ERROR : GetSelectedFiles not implemented"); } + virtual void OnSelectionChange(std::vector& s) + { GimmickError("INTERNAL ERROR : OnSelectionChange 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); + ///Requests the reading of an image with priority and index in the + /// current selection (-1 if not in selection) + void RequestReading(tree::Node* n, int prio, int selection_index); + + ///Returns true if the ImageEventQueue is empty + bool IsQueueEmpty(){return mImageEventQueue.empty();} + ///Clears the queue + void ClearQueue(){mImageEventQueue.clear();} + ///Returns the next in line EventType's image + vtkImageData* GetNextImageQueued(){return mImageEventQueue.front().image;} + ///Returns the next in line EventType's node + tree::Node* GetNextNodeQueued(){return mImageEventQueue.front().node;} + ///Returns the next in line EventType's index in selection + int GetNextSelectionIndexQueued(){return mImageEventQueue.front().index;} + ///Unqueus the next in line EventType + void UnqueueNext(){mImageEventQueue.pop_front();} + + + ///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(); @@ -112,7 +114,10 @@ namespace creaImageIO MultiThreadImageReaderUser::EventType t, vtkImageData* image); - //============================================= + vtkImageData* GetDefaultImage() { mReader.GetImage(""); } + + + //============================================= typedef boost::signal ValidationSignalType; typedef ValidationSignalType::slot_function_type ValidationCallbackType; //============================================= @@ -128,37 +133,44 @@ namespace creaImageIO void ConnectValidationObserver(ValidationCallbackType callback); //================================================================== + private: /// Controller which manages the interaction with the model Gimmick* mGimmick; /// The views TreeViewMapType mTreeViewMap; - /// The message that results from the validation - std::string mMess; - /// Multi-thread image reader - MultiThreadImageReader mReader; - /// Map of images' names to nodes - std::map mImageFileNameToNode; - /// type of image event - /// If the image pointer is non null then the image is available (loaded) + /// The message that results from the validation + std::string mMess; + + /// Multi-thread image reader + MultiThreadImageReader mReader; + /// Internal type of image reading event + /// If the image pointer is non null then the image is available (loaded) /// else it has been unloaded struct ImageEventType { - ImageEventType( tree::Node* no, vtkImageData* im ) - : node(no), image(im) {} + ImageEventType( tree::Node* no = 0, + vtkImageData* im = 0, + int sel_index = -1) + : node(no), image(im), index(sel_index) {} ImageEventType(vtkImageData* im ) : image(im) {} tree::Node* node; vtkImageData* image; + int index; }; + typedef std::map ImageEventTypeMap; + /// Map of images' names to ImageEventType + /// Used to associated a filename to a the data of a request + ImageEventTypeMap mImageEventMap; // queue of image event typedef std::deque ImageEventQueueType; ImageEventQueueType mImageEventQueue; ValidationSignalType mValidationSignal; - }; - // EO class GimmickView + }; + // EO class GimmickView //===================================================================== diff --git a/src2/creaImageIORFImageReader.cpp b/src2/creaImageIORFImageReader.cpp index 53111ac..886db78 100644 --- a/src2/creaImageIORFImageReader.cpp +++ b/src2/creaImageIORFImageReader.cpp @@ -61,8 +61,8 @@ namespace creaImageIO { rf_header h; ok = ReadHeader(rf_file,h); + fclose(rf_file); } - fclose(rf_file); return ok; } //===================================================================== diff --git a/src2/creaImageIOWxGimmickView.cpp b/src2/creaImageIOWxGimmickView.cpp index 572658b..e5c6574 100644 --- a/src2/creaImageIOWxGimmickView.cpp +++ b/src2/creaImageIOWxGimmickView.cpp @@ -97,21 +97,32 @@ namespace creaImageIO mNotebook = new wxNotebook(mSplitter, -1,wxDefaultPosition, wxDefaultSize, 0); - //Gimmick - mGimmick=gimmick; - mViewer=new WxViewer(this, wxID_ANY, wxT("Gimmick! Viewer"),wxDefaultPosition, wxDefaultSize ); - - - mSelectionMaxDimension= max_dim; - mSelectionMinDimension= min_dim; + //Gimmick + mGimmick=gimmick; + + mSelectionMaxDimension= max_dim; + mSelectionMinDimension= min_dim; + // Create the views CreateTreeViews(); // Bottom panel mBottomPanel = new wxPanel(mSplitter,-1); - mText = new wxStaticText(mBottomPanel, wxID_ANY, wxT("Status: Welcome to Gimmick!")); - + + wxBoxSizer *bottom_sizer = new wxBoxSizer(wxHORIZONTAL); + + mText = new wxStaticText(mBottomPanel, wxID_ANY, wxT("Status: Welcome to Gimmick!")); + bottom_sizer->Add(mText,1,wxGROW,0); + + // Previewer + mViewer = new WxViewer(mBottomPanel, wxID_ANY, wxT("Gimmick! Viewer"),wxDefaultPosition, wxDefaultSize ); + + bottom_sizer->Add(mViewer,1,wxGROW,0); + // mViewer->Show(); + + mBottomPanel->SetSizer(bottom_sizer); + // Splitting int hsize = size.GetHeight(); int bottom_minsize = 15; @@ -373,7 +384,9 @@ namespace creaImageIO } else { - mViewer->Hide(); + mViewer->SetMovieSize(1); + mViewer->SetImage(0,GetDefaultImage()); + // mViewer->Hide(); } @@ -390,23 +403,27 @@ namespace creaImageIO <SetMovieSize(sel.size());//ClearImages(); //First load the selected images mCurImageItemToShow = sel.front(); + int index = 0; std::vector::iterator selected; for(selected=sel.begin();selected!=sel.end();++selected) - { - GimmickDebugMessage(5, - "Requesting image from selected " - <<(*selected)->GetAttribute("FullFileName") - <GetAttribute("FullFileName") + < up; GetTreeViewMap()["Local database"]->GetNodes(up,true); std::vector::iterator iterUp; @@ -416,13 +433,14 @@ namespace creaImageIO "Requesting image from neighbors up " <<(*iterUp)->GetAttribute("FullFileName") < down; GetTreeViewMap()["Local database"]->GetNodes(down,false); std::vector::iterator iterDown; @@ -432,9 +450,10 @@ namespace creaImageIO "Requesting image from neighbors down " <<(*iterDown)->GetAttribute("FullFileName") <GetNumberOfLevels(); - std::vector sel=GetTreeViewMap()["Local database"]->GetSelected(level+1); + // int level=GetTreeViewMap()["Local database"]->GetNumberOfLevels(); + // std::vector sel=GetTreeViewMap()["Local database"]->GetSelected(level+1); + /* GimmickDebugMessage(5, "Processing Images. Lock Started" <ClearImages(); + while (!IsQueueEmpty()) { GimmickDebugMessage(5, "Queue not empty" <=0) + { + mViewer->SetImage(index,image); + } + /* tree::Node* node=GetNextNodeQueued(); + bool found=false; std::vector::iterator i; for(i=sel.begin();i!=sel.end()&&!found;++i) @@ -475,24 +503,30 @@ namespace creaImageIO found=true; } } + */ + } UnqueueNext(); } + /* if(!(mViewer->ImagesEmpty())) { GimmickDebugMessage(5, "Showing images" <ShowImages(); - mViewer->Show(); + // mViewer->ShowImages(); + // mViewer->Show(); } + */ ClearQueue(); MultiThreadImageReaderEventUnlock(); + /* GimmickDebugMessage(5, "Processing Images. Lock Ended" <Refresh(); } //================================================= diff --git a/src2/creaImageIOWxViewer.cpp b/src2/creaImageIOWxViewer.cpp index 63b2c88..ac2938b 100644 --- a/src2/creaImageIOWxViewer.cpp +++ b/src2/creaImageIOWxViewer.cpp @@ -19,29 +19,29 @@ namespace creaImageIO //===================================================================== //===================================================================== - class ThreadedMovie: public wxThread + class WxViewerPlayer: public wxThread { public: - ThreadedMovie(std::vector m, vtkImageViewer2* v, crea::creawxVTKRenderWindowInteractor* i, WxViewer* parent) : - mImagesToPlay(m), mViewer(v), mInteractor(i), mParent(parent) + WxViewerPlayer(WxViewer* v) : + mWxViewer(v) {} - + void* Entry(); - void SetImagesToPlay(std::vector im); - void ShowImage(vtkImageData* v); - void StartIterator(); + // void SetImagesToPlay(std::vector im); + // void ShowImage(vtkImageData* v); + // void StartIterator(); void OnExit(); private: - std::vector mImagesToPlay; - vtkImageViewer2* mViewer; - /// Associated wxvtk interactor - crea::creawxVTKRenderWindowInteractor *mInteractor; - std::vector::iterator i; - WxViewer* mParent; - - int mx1,mx2,my1,my2,mz1,mz2; - double mspx,mspy,mspz; + //std::vector mImagesToPlay; + //vtkImageViewer2* mViewer; + /// Associated wxvtk interactor + //crea::creawxVTKRenderWindowInteractor *mInteractor; + //std::vector::iterator i; + WxViewer* mWxViewer; + + // int mx1,mx2,my1,my2,mz1,mz2; + // double mspx,mspy,mspz; }; //===================================================================== @@ -53,19 +53,19 @@ namespace creaImageIO //===================================================================== // CTor WxViewer::WxViewer(wxWindow *parent, - wxWindowID id, - wxString title, - const wxPoint& pos, - const wxSize& size) - : wxFrame( parent, - id, - title, - pos, - size, - wxCAPTION) + wxWindowID id, + wxString title, + const wxPoint& pos, + const wxSize& size) + : wxPanel( parent, + id, + pos, + size) { + wxMutexLocker lock(mMutex); GimmickDebugMessage(1,"WxViewer::WxViewer" <SetupInteractor ( mInteractor ); - mMovie=new ThreadedMovie(images, mViewer, mInteractor, this); + mCurrent = 0; + + mPlayer = new WxViewerPlayer(this); //images, mViewer, mInteractor, this); + mPlayer->Create(); + mPlayer->Run(); topsizer-> Add( mInteractor ,1,wxGROW ,0); SetSizer( topsizer ); Layout(); } + //===================================================================== + //===================================================================== /// Destructor WxViewer::~WxViewer() { + wxMutexLocker lock(mMutex); GimmickDebugMessage(1,"WxViewer::~WxViewer" <UnRegister(NULL); + images[i] = im; + // if (im!=0) im->Register(NULL); + } } + //================================================================ + + + //================================================================ + + bool WxViewer::ImagesEmpty() + { + wxMutexLocker lock(mMutex); + return images.empty(); + } + //================================================================ + + //================================================================ + + void WxViewer::SetMovieSize(unsigned int si) + { + wxMutexLocker lock(mMutex); + GimmickDebugMessage(5,"WxViewer::SetMovieSize("<<(int)si<<")" + <UnRegister(NULL); + } + } + images.clear(); + for (unsigned int i=0;i= images.size()) mCurrent = 0; + } + //================================================================ + + + + + //===================================================================== void WxViewer::ShowImage(vtkImageData* im) { GimmickDebugMessage(5,"WxViewer::ShowImage" <SetInput(im); mViewer->SetSlice( 0 ); @@ -169,68 +252,25 @@ namespace creaImageIO } - mInteractor->Render(); - mViewer->Render(); - } - - //================================================================ - - //================================================================ - - void WxViewer::AddImage(vtkImageData* im) - { - images.push_back(im); - } + // mInteractor->Refresh(); + //mInteractor->Render(); + // mViewer->Render(); - //================================================================ - + ::wxWakeUpIdle(); + } //================================================================ - void WxViewer::ShowImages() + //================================================== + void WxViewer::OnInternalIdle() { - if(!(mMovie->IsAlive())) - { - mMovie->SetImagesToPlay(images); - mMovie->StartIterator(); - mMovie->Create(); - mMovie->Run(); - } - else - { - if(!images.empty()) - { - mMovie->Pause(); - mMovie->SetImagesToPlay(images); - mMovie->StartIterator(); - mMovie->Resume(); - } - else - { - GimmickMessage(1,"I'm empty!!!!! "<Refresh(); + mInteractor->Render(); + //mViewer->Render(); } - - //================================================================ - //================================================================ + //================================================= + - bool WxViewer::ImagesEmpty() - { - return images.empty(); - } - //================================================================ // BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog) // END_EVENT_TABLE() //================================================================ @@ -244,14 +284,18 @@ namespace creaImageIO //======================================================================== //======================================================================== - void* ThreadedMovie::Entry() + void* WxViewerPlayer::Entry() { - GimmickMessage(1,"ThreadedMovie::Entry()"<ShowNextImage(); clock_t endwait; + endwait = clock () + 0.2 * CLOCKS_PER_SEC ; + while (clock() < endwait) {} + /* for(i=mImagesToPlay.begin();i!=mImagesToPlay.end();++i) { if(i!=mImagesToPlay.end()) @@ -266,7 +310,7 @@ namespace creaImageIO } } - + */ } return 0; } @@ -274,109 +318,13 @@ namespace creaImageIO //===================================================================== //===================================================================== - void ThreadedMovie::OnExit() + void WxViewerPlayer::OnExit() { - GimmickMessage(1,"Hello WORLD IM OUT!!!!!!!! "< im) - { - mImagesToPlay=im; - } - - //===================================================================== - - //===================================================================== - void ThreadedMovie::StartIterator() - { - i=mImagesToPlay.begin(); - } - - //===================================================================== - - //===================================================================== - void ThreadedMovie::ShowImage(vtkImageData* im) - { - mViewer->SetInput(im); - mViewer->SetSlice( 0 ); - - int x1,x2,y1,y2,z1,z2; - double spx,spy,spz; - - im->Update(); - - im->GetSpacing(spx,spy,spz); - im->GetExtent (x1,x2,y1,y2,z1,z2); - /* - std::cout << "-----------------------------"<GetScalarRange(); - mViewer->SetColorWindow(range[1] - range[0]); - mViewer->SetColorLevel(0.5 * (range[1] + range[0])); - - mViewer->GetRenderer()->ResetCamera(); - double bounds[6]; - - - mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds); - - /* - std::cout <<"bounds : "<GetRenderer()->ResetCameraClippingRange(bounds); - /* - vtkCamera *camera = mViewer->GetRenderer()->GetActiveCamera(); - - camera->SetViewUp ( spx*0, -spy*1, spz*0); - camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*10000000); - camera->SetFocalPoint ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0); - - camera->ComputeViewPlaneNormal(); - camera->SetParallelScale( spx*(x2-x1)/2.0 ); - - camera->Roll ( 180 ); - */ - - } - - //mInteractor->Render(); - } - } // EO namespace creaImageIO diff --git a/src2/creaImageIOWxViewer.h b/src2/creaImageIOWxViewer.h index 21fbf50..92fcb64 100644 --- a/src2/creaImageIOWxViewer.h +++ b/src2/creaImageIOWxViewer.h @@ -19,13 +19,13 @@ namespace creaImageIO { - class ThreadedMovie; + class WxViewerPlayer; - class WxViewer : public wxFrame + class WxViewer : public wxPanel { - public: - friend class ThreadedMovie; + public: + // friend class ThreadedMovie; /// Ctor WxViewer(); WxViewer(wxWindow *parent, @@ -35,30 +35,45 @@ namespace creaImageIO const wxSize& size); /// Dtor virtual ~WxViewer(); - ///Shows the image in the vector as a movie - void ShowImages(); - ///Shows the image passed as parameter - void ShowImage(vtkImageData* im); - ///Adds an image to the selection - void AddImage(vtkImageData* im); - ///Clears the selection of images - void ClearImages(); - ///Returns true if the image vector is empty - bool ImagesEmpty(); + ///Shows the image in the vector as a movie + //void ShowImages(); + /// Sets the movie size + void SetMovieSize(unsigned int); + ///Sets the ith image of the movie + void SetImage(int i, vtkImageData* im); + ///Clears the selection of images + // void ClearImages(); + ///Returns true if the image vector is empty + bool ImagesEmpty(); + /// + void ShowNextImage(); + + void OnInternalIdle(); + private: - /// Previewer + ///Shows the image passed as parameter + void ShowImage(vtkImageData* im); + + /// Previewer vtkImageViewer2* mViewer; /// Associated wxvtk interactor - crea::creawxVTKRenderWindowInteractor *mInteractor; - + crea::creawxVTKRenderWindowInteractor *mInteractor; + + /// Current extent int mx1,mx2,my1,my2,mz1,mz2; + /// Current spacing double mspx,mspy,mspz; - /// The vector of images to show - std::vector images; - ///The threaded movie - ThreadedMovie* mMovie; + /// The vector of images to show + std::vector images; + /// + int mCurrent; + ///The threaded movie player + WxViewerPlayer* mPlayer; + + /// The mutex + wxMutex mMutex; }; -- 2.46.1