]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/image3DDequeUR.cxx
809a3952ad8426620c22309038662e0dc6c34097
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / manualPaint / image3DDequeUR.cxx
1 #include "image3DDequeUR.h"
2
3 Image3DDequeUR::Image3DDequeUR() {
4         this->m_globalPath = "/tmp/";
5         this->m_currentUndoPos = -1;
6 }
7 //virtual
8 Image3DDequeUR::~Image3DDequeUR() {
9
10 }
11 //virtual
12 void Image3DDequeUR::addImageToUndoContainer(ImageType* img,
13                 const RegionS& region) {
14         //managing memory
15         if (this->m_ImgUndoDeque.size() > 0) {
16                 this->m_ImgUndoDeque.back().removeImageFromMemory();
17         } //fi
18         ImageInfoUR imageInfo;
19         imageInfo.setImageName(this->getImageName());
20         imageInfo.setImage(img);
21         imageInfo.setRegion(region);
22         //saving to disk
23         std::string fullpath = this->m_globalPath + imageInfo.getImageName()
24                         + "_UNDO.MHD";
25         this->saveImageAsMHD(img, fullpath);
26         //Adding to deque
27         this->m_ImgUndoDeque.push_back(imageInfo);
28         this->m_currentUndoPos = this->m_ImgUndoDeque.size() - 1;
29 }
30 //virtual
31 void Image3DDequeUR::addImageToRedoContainer(ImageType* img,
32                 const RegionS& region) {
33         //managing memory
34         if (this->m_ImgRedoDeque.size() > 0) {
35                 this->m_ImgRedoDeque.back().removeImageFromMemory();
36         } //fi
37         ImageInfoUR imageInfo;
38         imageInfo.setImageName(this->getImageName());
39         imageInfo.setImage(img);
40         imageInfo.setRegion(region);
41         //saving to disk
42         std::string fullpath = this->m_globalPath + imageInfo.getImageName()
43                         + "_REDO.MHD";
44         this->saveImageAsMHD(img, fullpath);
45         //Adding to deque
46         this->m_ImgRedoDeque.push_back(imageInfo);
47 }
48 //virtual
49 void Image3DDequeUR::loadUndoImageToPMemory(const unsigned int& index) {
50         creaImageIO::ImageReader reader;
51         std::string fullPath = this->m_globalPath
52                         + this->m_ImgUndoDeque[index].getImageName();
53         this->m_ImgUndoDeque[index].setImage(reader.ReadImage(fullPath));
54 }
55 //virtual
56 void Image3DDequeUR::removeUndoImageFromPMemory(const unsigned int& index) {
57         this->m_ImgUndoDeque[index].removeImageFromMemory();
58 }
59 //virtual
60 void Image3DDequeUR::loadRedoImageToPMemory(const unsigned int& index) {
61         creaImageIO::ImageReader reader;
62         std::string fullPath = this->m_globalPath
63                         + this->m_ImgRedoDeque[index].getImageName();
64         this->m_ImgRedoDeque[index].setImage(reader.ReadImage(fullPath));
65 }
66 //virtual
67 void Image3DDequeUR::removeRedoImageFromPMemory(const unsigned int& index) {
68         this->m_ImgRedoDeque[index].removeImageFromMemory();
69 }
70 //virtual
71 void Image3DDequeUR::saveImageAsMHD(ImageType* img,
72                 const std::string& filename) {
73         vtkMetaImageWriter* w = vtkMetaImageWriter::New();
74         w->SetInput(img);
75         w->SetCompression(false);
76         w->SetFileDimensionality(img->GetDataDimension());
77         w->SetFileName(filename.c_str());
78         w->Update();
79         w->Write();
80         w->Delete();
81 }
82
83 //virtual
84 ImageInfoUR Image3DDequeUR::undo() {
85         ImageInfoUR imgRet;
86         if (this->m_currentUndoPos < (this->m_ImgUndoDeque.size() + 1)) {
87                 this->m_ImgUndoDeque[(unsigned int) (m_currentUndoPos + 1)].removeImageFromMemory();
88         } //fi
89         if (this->m_currentUndoPos != -1) {
90                 //removing from memory
91                 if ((this->m_currentUndoPos + 1) < this->m_ImgUndoDeque.size()) {
92                         this->m_ImgUndoDeque[(unsigned int) (m_currentUndoPos + 1)].removeImageFromMemory();
93                 } //fi
94                 ImageInfoUR imgRet =
95                                 this->m_ImgUndoDeque[(unsigned int) m_currentUndoPos];
96                 this->m_currentUndoPos--;
97                 //adding to memory
98                 if (this->m_currentUndoPos != -1) {
99                         this->loadUndoImageToPMemory((unsigned int) m_currentUndoPos);
100                 } //fi
101         } //fi
102         return (imgRet);
103 }
104 //virtual
105 ImageInfoUR Image3DDequeUR::redo() {
106         ImageInfoUR imgRet;
107         if (this->m_currentUndoPos >= (this->m_ImgRedoDeque.size() - 1)
108                         && (this->m_ImgRedoDeque.size() > 0)) {
109                 this->m_ImgUndoDeque[(unsigned int) (m_currentUndoPos)].removeImageFromMemory();
110                 this->m_currentUndoPos++;
111                 this->loadUndoImageToPMemory((unsigned int) m_currentUndoPos);
112                 imgRet = this->m_ImgRedoDeque.back();
113                 this->m_ImgRedoDeque.pop_back();
114                 if (this->m_ImgRedoDeque.size() > 0) {
115                         loadRedoImageToPMemory(
116                                         (unsigned int) (this->m_ImgRedoDeque.size() - 1));
117                 } //fi
118         } //fi
119         return (imgRet);
120 }
121
122 void Image3DDequeUR::cleanContainers() {
123         for (unsigned int i = 0; i < this->m_ImgUndoDeque.size(); i++) {
124                 this->m_ImgUndoDeque[i].removeImageFromMemory();
125         } //rof
126         for (unsigned int i = 0; i < this->m_ImgRedoDeque.size(); i++) {
127                 this->m_ImgRedoDeque[i].removeImageFromMemory();
128         } //rof
129         this->m_ImgRedoDeque.clear();
130         this->m_ImgUndoDeque.clear();
131 }
132
133 void Image3DDequeUR::setGlobalPath(const std::string& globalPath) {
134         this->m_globalPath = globalPath;
135 }
136
137 std::string Image3DDequeUR::getGlobalPath() {
138         return (this->m_globalPath);
139 }
140
141 std::string Image3DDequeUR::getImageName() {
142         //Giving a name to an image using the date and time
143         time_t rawtime;
144         struct tm * timeinfo;
145         char buffer[80];
146         time(&rawtime);
147         timeinfo = localtime(&rawtime);
148         strftime(buffer, 80, "%a_%d_%b_%y_%H_%M_S", timeinfo);
149         std::string date(buffer);
150         std::string aux(buffer);
151         std::string imageName = "img_" + aux;
152         return (imageName);
153 }