From 63d83c9fb48889ed37a2e3f06c0d96c76e10d666 Mon Sep 17 00:00:00 2001 From: Diego Caceres Date: Tue, 4 Oct 2011 13:40:32 +0000 Subject: [PATCH] DFCH: ManualPaint (UNdo/Redo) changes --- .../widgets/manualPaint/image3DDequeUR.cxx | 146 ++++++++++++------ .../widgets/manualPaint/image3DDequeUR.h | 24 +-- .../widgets/manualPaint/imageDequeUR.h | 13 +- 3 files changed, 116 insertions(+), 67 deletions(-) diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/image3DDequeUR.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/image3DDequeUR.cxx index 36dd016..809a395 100644 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/image3DDequeUR.cxx +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/image3DDequeUR.cxx @@ -9,45 +9,63 @@ Image3DDequeUR::~Image3DDequeUR() { } //virtual -void Image3DDequeUR::addImageToContainer(ImageType* img, +void Image3DDequeUR::addImageToUndoContainer(ImageType* img, const RegionS& region) { //managing memory - if (this->m_ImgDeque.size() > 0) { - this->m_ImgDeque.back().removeImageFromMemory(); - this->m_ImgDeque.back().setStatus(false); + if (this->m_ImgUndoDeque.size() > 0) { + this->m_ImgUndoDeque.back().removeImageFromMemory(); } //fi - //This is to take actual Date - time_t rawtime; - struct tm * timeinfo; - char buffer[80]; - time(&rawtime); - timeinfo = localtime(&rawtime); - strftime(buffer, 80, "%a_%d_%b_%y_%H_%M_S", timeinfo); - std::string date(buffer); - //end - std::string aux(buffer); - std::string imageName = "img_" + aux; ImageInfoUR imageInfo; - imageInfo.setImageName(imageName); + imageInfo.setImageName(this->getImageName()); imageInfo.setImage(img); imageInfo.setRegion(region); - imageInfo.setStatus(true); //saving to disk - std::string fullpath = this->m_globalPath + imageName; + std::string fullpath = this->m_globalPath + imageInfo.getImageName() + + "_UNDO.MHD"; this->saveImageAsMHD(img, fullpath); //Adding to deque - this->m_ImgDeque.push_back(imageInfo); + this->m_ImgUndoDeque.push_back(imageInfo); + this->m_currentUndoPos = this->m_ImgUndoDeque.size() - 1; +} +//virtual +void Image3DDequeUR::addImageToRedoContainer(ImageType* img, + const RegionS& region) { + //managing memory + if (this->m_ImgRedoDeque.size() > 0) { + this->m_ImgRedoDeque.back().removeImageFromMemory(); + } //fi + ImageInfoUR imageInfo; + imageInfo.setImageName(this->getImageName()); + imageInfo.setImage(img); + imageInfo.setRegion(region); + //saving to disk + std::string fullpath = this->m_globalPath + imageInfo.getImageName() + + "_REDO.MHD"; + this->saveImageAsMHD(img, fullpath); + //Adding to deque + this->m_ImgRedoDeque.push_back(imageInfo); +} +//virtual +void Image3DDequeUR::loadUndoImageToPMemory(const unsigned int& index) { + creaImageIO::ImageReader reader; + std::string fullPath = this->m_globalPath + + this->m_ImgUndoDeque[index].getImageName(); + this->m_ImgUndoDeque[index].setImage(reader.ReadImage(fullPath)); +} +//virtual +void Image3DDequeUR::removeUndoImageFromPMemory(const unsigned int& index) { + this->m_ImgUndoDeque[index].removeImageFromMemory(); } //virtual -void Image3DDequeUR::loadImageToPMemory(const unsigned int& index) { +void Image3DDequeUR::loadRedoImageToPMemory(const unsigned int& index) { creaImageIO::ImageReader reader; std::string fullPath = this->m_globalPath - + this->m_ImgDeque[index].getImageName(); - this->m_ImgDeque[index].setImage(reader.ReadImage(fullPath)); + + this->m_ImgRedoDeque[index].getImageName(); + this->m_ImgRedoDeque[index].setImage(reader.ReadImage(fullPath)); } //virtual -void Image3DDequeUR::removeImageFromPMemory(const unsigned int& index) { - this->m_ImgDeque[index].removeImageFromMemory(); +void Image3DDequeUR::removeRedoImageFromPMemory(const unsigned int& index) { + this->m_ImgRedoDeque[index].removeImageFromMemory(); } //virtual void Image3DDequeUR::saveImageAsMHD(ImageType* img, @@ -62,46 +80,74 @@ void Image3DDequeUR::saveImageAsMHD(ImageType* img, w->Delete(); } -//ATENCIIIOOOON TIENE QUE HACER POP PARA PONER EL REDO //virtual ImageInfoUR Image3DDequeUR::undo() { - if (this->m_currentUndoPos == -1) { - ImageInfoUR retAux; - return (retAux); + ImageInfoUR imgRet; + if (this->m_currentUndoPos < (this->m_ImgUndoDeque.size() + 1)) { + this->m_ImgUndoDeque[(unsigned int) (m_currentUndoPos + 1)].removeImageFromMemory(); + } //fi + if (this->m_currentUndoPos != -1) { + //removing from memory + if ((this->m_currentUndoPos + 1) < this->m_ImgUndoDeque.size()) { + this->m_ImgUndoDeque[(unsigned int) (m_currentUndoPos + 1)].removeImageFromMemory(); + } //fi + ImageInfoUR imgRet = + this->m_ImgUndoDeque[(unsigned int) m_currentUndoPos]; + this->m_currentUndoPos--; + //adding to memory + if (this->m_currentUndoPos != -1) { + this->loadUndoImageToPMemory((unsigned int) m_currentUndoPos); + } //fi } //fi - ImageInfoUR imgRet = m_ImgDeque[(unsigned int) m_currentUndoPos]; - this->m_currentUndoPos--; return (imgRet); } //virtual ImageInfoUR Image3DDequeUR::redo() { - if (this->m_currentUndoPos != (this->m_ImgDeque.size() - 1)) { + ImageInfoUR imgRet; + if (this->m_currentUndoPos >= (this->m_ImgRedoDeque.size() - 1) + && (this->m_ImgRedoDeque.size() > 0)) { + this->m_ImgUndoDeque[(unsigned int) (m_currentUndoPos)].removeImageFromMemory(); this->m_currentUndoPos++; - return (m_ImgDeque[(unsigned int) m_currentUndoPos]); + this->loadUndoImageToPMemory((unsigned int) m_currentUndoPos); + imgRet = this->m_ImgRedoDeque.back(); + this->m_ImgRedoDeque.pop_back(); + if (this->m_ImgRedoDeque.size() > 0) { + loadRedoImageToPMemory( + (unsigned int) (this->m_ImgRedoDeque.size() - 1)); + } //fi } //fi - ImageInfoUR retAux; - return (retAux); + return (imgRet); +} + +void Image3DDequeUR::cleanContainers() { + for (unsigned int i = 0; i < this->m_ImgUndoDeque.size(); i++) { + this->m_ImgUndoDeque[i].removeImageFromMemory(); + } //rof + for (unsigned int i = 0; i < this->m_ImgRedoDeque.size(); i++) { + this->m_ImgRedoDeque[i].removeImageFromMemory(); + } //rof + this->m_ImgRedoDeque.clear(); + this->m_ImgUndoDeque.clear(); } + void Image3DDequeUR::setGlobalPath(const std::string& globalPath) { this->m_globalPath = globalPath; } -void Image3DDequeUR::removeFirstImageFromContainer() { - this->m_ImgDeque.pop_front(); -} -void Image3DDequeUR::removeLastImageFromContainer() { - this->m_ImgDeque.pop_back(); -} -void Image3DDequeUR::cleanContainer() { - this->m_ImgDeque.clear(); -} -void Image3DDequeUR::cleanContainerFromIndex(const unsigned int& index) { - for (unsigned int i = this->m_ImgDeque.size(); i >= index; i--) { - this->m_ImgDeque.pop_back(); - } -} + std::string Image3DDequeUR::getGlobalPath() { return (this->m_globalPath); } -void Image3DDequeUR::setUndoPointerOnTop() { - this->m_currentUndoPos = this->m_ImgDeque.size() - 1; + +std::string Image3DDequeUR::getImageName() { + //Giving a name to an image using the date and time + time_t rawtime; + struct tm * timeinfo; + char buffer[80]; + time(&rawtime); + timeinfo = localtime(&rawtime); + strftime(buffer, 80, "%a_%d_%b_%y_%H_%M_S", timeinfo); + std::string date(buffer); + std::string aux(buffer); + std::string imageName = "img_" + aux; + return (imageName); } diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/image3DDequeUR.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/image3DDequeUR.h index a8ef891..39c0468 100644 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/image3DDequeUR.h +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/image3DDequeUR.h @@ -16,26 +16,26 @@ class Image3DDequeUR : public ImageDequeUR { private: - ImageInfoDeque m_ImgDeque; + ImageInfoDeque m_ImgUndoDeque; + ImageInfoDeque m_ImgRedoDeque; int m_currentUndoPos; std::string m_globalPath; public: Image3DDequeUR(); virtual ~Image3DDequeUR(); - virtual void addImageToContainer(ImageType* img, const RegionS& region); - virtual void loadImageToPMemory( const unsigned int& index ); - virtual void removeImageFromPMemory( const unsigned int& index ); + virtual void addImageToUndoContainer(ImageType* img, const RegionS& region); + virtual void addImageToRedoContainer(ImageType* img, const RegionS& region); + virtual void loadUndoImageToPMemory( const unsigned int& index ); + virtual void removeUndoImageFromPMemory( const unsigned int& index ); + virtual void loadRedoImageToPMemory( const unsigned int& index ); + virtual void removeRedoImageFromPMemory( const unsigned int& index ); virtual void saveImageAsMHD( ImageType* img, const std::string& filename ); - virtual ImageInfoUR undo(); - virtual ImageInfoUR redo(); + virtual ImageInfoUR undo( ); + virtual ImageInfoUR redo( ); + void cleanContainers(); void setGlobalPath( const std::string& globalPath ); - void removeFirstImageFromContainer(); - void removeLastImageFromContainer(); - void cleanContainer(); - void setUndoPointerOnTop(); std::string getGlobalPath( ); -private: - void cleanContainerFromIndex(const unsigned int& index); + std::string getImageName( ); }; diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/imageDequeUR.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/imageDequeUR.h index 9d475d8..46b72bd 100644 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/imageDequeUR.h +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/imageDequeUR.h @@ -23,12 +23,15 @@ class ImageDequeUR { public: ImageDequeUR(); virtual ~ImageDequeUR(); - virtual void addImageToContainer(ImageType* img, const RegionS& region); - virtual void loadImageToPMemory( const unsigned int& index ); - virtual void removeImageFromPMemory( const unsigned int& index ); + virtual void addImageToUndoContainer(ImageType* img, const RegionS& region); + virtual void addImageToRedoContainer(ImageType* img, const RegionS& region); + virtual void loadUndoImageToPMemory( const unsigned int& index ); + virtual void removeUndoImageFromPMemory( const unsigned int& index ); + virtual void loadRedoImageToPMemory( const unsigned int& index ); + virtual void removeRedoImageFromPMemory( const unsigned int& index ); virtual void saveImageAsMHD( ImageType* img, const std::string& filename ); - virtual ImageInfoUR undo(); - virtual ImageInfoUR redo(); + virtual ImageInfoUR undo( ); + virtual ImageInfoUR redo( ); private: void cleanContainerFromIndex(const unsigned int& index); }; -- 2.45.1