/*! * @file imageUndoRedo.cxx * @brief This file contains the implementation of the ImageUndoRedo class. * @author Info-Dev * @author Diego CACERES (diego.caceres[AT]creatis.insa-lyon.fr) * @date 2011-11-15 */ #include "imageUndoRedo.h" // ---------------------------------------------------------------------------------- ImageUndoRedo::ImageUndoRedo() { this->m_ImagesDeque = new IDequeType(); } // ---------------------------------------------------------------------------------- //virtual ImageUndoRedo::~ImageUndoRedo() { } // ---------------------------------------------------------------------------------- //virtual void ImageUndoRedo::Undo() { ImageInfoUR* imageInfo = this->m_ImagesDeque->Undo(); if (imageInfo != NULL) { this->DrawUR(imageInfo, true); this->UpdateUndoImage(); } } // ---------------------------------------------------------------------------------- //virtual void ImageUndoRedo::Redo() { ImageInfoUR* imageInfo = this->m_ImagesDeque->Redo(); if (imageInfo != NULL) { this->DrawUR(imageInfo, false); this->UpdateUndoImage(); } } // ---------------------------------------------------------------------------------- void ImageUndoRedo::SetImage(VTKImageDataPointerType image) { this->m_CurrentImage = image; this->m_CurrentImage->Update(); this->UpdateUndoImage(); } // ---------------------------------------------------------------------------------- //virtual void ImageUndoRedo::SetURImages(ImageMManagerType* imMManager) { ImageMManagerType* newImageManager = new ImageMManagerType(imMManager); if (newImageManager->ValidateRegion()) { RegionSType region = newImageManager->GetModifiedRegion(); VTKImageDataPointerType imgUndo = this->GetImageRegion(region, this->m_UndoImage); VTKImageDataPointerType imgRedo = this->GetImageRegion(region, this->m_CurrentImage); this->m_ImagesDeque->AddImagesToURContainer(imgUndo, imgRedo, newImageManager); this->UpdateUndoImage(); } else { std::cerr << "INVALID REGION" << std::endl; } } // ---------------------------------------------------------------------------------- void ImageUndoRedo::UpdateUndoImage() { this->m_CurrentImage->Update(); this->m_UndoImage = VTKImageDataPointerType::New(); this->m_UndoImage->DeepCopy(m_CurrentImage); this->m_UndoImage->Update(); } // ---------------------------------------------------------------------------------- ImageUndoRedo::VTKImageDataPointerType ImageUndoRedo::GetImageRegion( const RegionSType& region, VTKImageDataPointerType img) { VTKExtractVOIPointerType extract = VTKExtractVOIPointerType::New(); extract->SetVOI(region.minX, region.maxX, region.minY, region.maxY, region.minZ, region.maxZ); extract->SetSampleRate(1, 1, 1); extract->SetInput(img); VTKImageDataPointerType imgResult = extract->GetOutput(); imgResult->Update(); return (imgResult); } // ---------------------------------------------------------------------------------- void ImageUndoRedo::SetCurrentImage(VTKImageDataPointerType img) { this->m_CurrentImage = img; } // ---------------------------------------------------------------------------------- //virtual void ImageUndoRedo::DrawUR(ImageInfoUR* imageInfo, const bool& undo) { VTKImageDataPointerType img; if (undo) { img = imageInfo->GetUndoImage(); } //fi else { img = imageInfo->GetRedoImage(); } //else RegionSType region = imageInfo->GetImageMManager()->GetModifiedRegion(); if (img != NULL) { for (int i = region.minX, x = 0; i <= region.maxX; i++, x++) { for (int j = region.minY, y = 0; j <= region.maxY; j++, y++) { for (int k = region.minZ, z = 0; k <= region.maxZ; k++, z++) { float value = img->GetScalarComponentAsFloat(x, y, z, 0); this->m_CurrentImage->SetScalarComponentFromFloat(i, j, k, 0, value); } //rof } //rof } //rof this->m_CurrentImage->Modified(); } this->m_ImagesDeque->ManageMemory(); } // ----------------------------------------------------------------------------------