]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/imageUndoRedo/image3DDequeUR.cxx
efd0d91e8160f3c76d3185d78f503092f210b1ea
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / imageUndoRedo / image3DDequeUR.cxx
1 /*!
2  * @file        image3DDequeUR.cxx
3  * @brief       This file contains the implementation of the Image3DDequeUR class.
4  * @author      Info-Dev
5  * @author      Diego CACERES (diego.caceres[AT]creatis.insa-lyon.fr)
6  * @date        2011-11-15
7  */
8
9 #include "image3DDequeUR.h"
10 #include <iostream>
11 #include <sstream>
12
13 // ----------------------------------------------------------------------------------
14 Image3DDequeUR::Image3DDequeUR( )
15 {
16
17
18 #ifdef _WIN32
19         this->m_GlobalPath = std::getenv("TEMP");
20 #endif
21 #ifdef _WIN64
22         this->m_GlobalPath = std::getenv("TEMP");
23 #endif
24 #ifdef LINUX
25         this->m_GlobalPath = "/tmp/";
26 #endif // MACOSX
27         this->m_CurrentURPos = -1;
28 }
29 // ----------------------------------------------------------------------------------
30 //virtual
31 Image3DDequeUR::~Image3DDequeUR( )
32 {
33         this->CleanHardDisk( );
34 }
35 // ----------------------------------------------------------------------------------
36 //virtual
37 void Image3DDequeUR::AddImagesToURContainer( VTKImageDataPointerType imgUndo,
38         VTKImageDataPointerType imgRedo, ImageMManager* imMManager )
39 {
40         this->CleanURContainerFromIndex( this->m_CurrentURPos + 1 );
41         //Adding image
42         ImageInfoUR* imageInfo = new ImageInfoUR( );
43         imageInfo->SetImageName( this->GetImageName( this->m_ImgURDeque.size( ) ) );
44         imageInfo->SetImages( imgUndo, imgRedo );
45         imageInfo->SetImageMManager( imMManager );
46         //Adding to deque
47         this->m_ImgURDeque.push_back( imageInfo );
48         this->m_CurrentURPos = this->m_ImgURDeque.size( ) - 1;
49         //Managing memory
50         this->ManageMemory( );
51 }
52 // ----------------------------------------------------------------------------------
53 //virtual
54 ImageInfoUR* Image3DDequeUR::Undo( )
55 {
56         ImageInfoUR* imgRet = NULL;
57         int imgURDequeSize = this->m_ImgURDeque.size( );
58         if( ( this->m_ImgURDeque.size( ) > 0 ) && ( this->m_CurrentURPos != -1 )
59                 && ( this->m_CurrentURPos < imgURDequeSize ) )
60         {
61                 imgRet = this->m_ImgURDeque[ m_CurrentURPos ];
62                 this->m_CurrentURPos--;
63         } //fi
64         return ( imgRet );
65 }
66 // ----------------------------------------------------------------------------------
67 //virtual
68 ImageInfoUR* Image3DDequeUR::Redo( )
69 {
70         ImageInfoUR* imgRet = NULL;
71         this->m_CurrentURPos++;
72         int imgURDequeSize = this->m_ImgURDeque.size( );
73         if( ( this->m_ImgURDeque.size( ) > 0 ) && ( this->m_CurrentURPos != -1 )
74                 && ( this->m_CurrentURPos < imgURDequeSize ) )
75         {
76                 imgRet = this->m_ImgURDeque[ m_CurrentURPos ];
77         } //fi
78         else
79         {
80                 this->m_CurrentURPos--;
81         }
82         return ( imgRet );
83 }
84 // ----------------------------------------------------------------------------------
85 //virtual
86 void Image3DDequeUR::CleanURContainerFromIndex( const int& index )
87 {
88         int count = 0;
89         for( unsigned int i = index; i < this->m_ImgURDeque.size( ); i++ )
90         {
91                 this->m_ImgURDeque[ i ]->RemoveImagesFromMemory( this->m_GlobalPath );
92                 this->m_ImgURDeque[ i ]->RemoveImagesFromDisk( this->m_GlobalPath );
93                 count++;
94         }
95         for( int i = 0; i < count; i++ )
96         {
97                 this->m_ImgURDeque.pop_back( );
98         } //rof
99 }
100 // ----------------------------------------------------------------------------------
101 //virtual
102 void Image3DDequeUR::ManageMemory( )
103 {
104         int imgURDequeSize = this->m_ImgURDeque.size( );
105         for( int i = 0; i < imgURDequeSize; i++ )
106         {
107                 if( this->m_ImgURDeque[ i ]->GetStatus( ) )
108                 {
109                         this->m_ImgURDeque[ i ]->RemoveImagesFromMemory(
110                                 this->m_GlobalPath );
111                 } //fi
112         } //rof
113           //Adding CurrentUndoPos to memory
114         if( ( this->m_CurrentURPos != -1 )
115                 && !( this->m_ImgURDeque[ this->m_CurrentURPos ]->GetStatus( ) ) )
116         {
117                 this->m_ImgURDeque[ this->m_CurrentURPos ]->LoadImagesToMemory(
118                         this->m_GlobalPath );
119         }
120         int currentRedoPos = this->m_CurrentURPos + 1;
121         if( ( currentRedoPos < imgURDequeSize )
122                 && !( this->m_ImgURDeque[ currentRedoPos ]->GetStatus( ) ) )
123         {
124                 this->m_ImgURDeque[ currentRedoPos ]->LoadImagesToMemory(
125                         this->m_GlobalPath );
126         }
127 }
128 // ----------------------------------------------------------------------------------
129 void Image3DDequeUR::SetGlobalPath( const StringType& globalPath )
130 {
131         this->m_GlobalPath = globalPath;
132 }
133 // ----------------------------------------------------------------------------------
134 void Image3DDequeUR::CleanHardDisk( )
135 {
136         for( unsigned int i = 0; i < this->m_ImgURDeque.size( ); i++ )
137         {
138                 this->m_ImgURDeque[ i ]->RemoveImagesFromDisk( this->m_GlobalPath );
139         }
140 }
141 // ----------------------------------------------------------------------------------
142 Image3DDequeUR::StringType Image3DDequeUR::GetGlobalPath( )
143 {
144         return ( this->m_GlobalPath );
145 }
146 // ----------------------------------------------------------------------------------
147 Image3DDequeUR::StringType Image3DDequeUR::GetImageName( const int & pos )
148 {
149 //Giving a name to an image using the date and time
150         if( this->m_IDImages.empty( ) )
151         {
152                 time_t rawtime;
153                 struct tm * timeinfo;
154                 char buffer[ 80 ];
155                 time( &rawtime );
156                 timeinfo = localtime( &rawtime );
157                 strftime( buffer, 80, "%H%M%S_%a_%d_%b_%y_", timeinfo );
158                 StringType date( buffer );
159                 StringType aux( buffer );
160                 this->m_IDImages = "img_" + aux;
161         }
162         std::stringstream ss; //create a stringstream
163         ss << pos; //add number to the stream
164         StringType imageName = this->m_IDImages + ss.str( );
165         return ( imageName );
166 }
167 // ----------------------------------------------------------------------------------