1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://www.centreleonberard.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
19 #include "vvReadState.h"
20 #include "vvMainWindow.h"
21 #include "vvSlicerManager.h"
22 #include "vvToolCreatorBase.h"
23 #include "vvToolBaseBase.h"
25 #include <qtreewidget.h>
28 #include <QXmlStreamReader>
33 //------------------------------------------------------------------------------
34 vvReadState::vvReadState() : m_XmlReader(new QXmlStreamReader), m_File(new QFile)
38 //------------------------------------------------------------------------------
41 //------------------------------------------------------------------------------
42 vvReadState::~vvReadState()
45 //------------------------------------------------------------------------------
48 //------------------------------------------------------------------------------
49 void vvReadState::Run(vvMainWindow* vvWindow, const std::string& file)
54 m_File->setFileName(file.c_str());
55 m_File->open(QIODevice::ReadOnly);
56 m_XmlReader->setDevice(m_File.get());
58 QTreeWidget* tree = m_Window->GetTree();
60 // Get the number of images already loaded
61 m_TreeItemCount = tree->topLevelItemCount();
68 //------------------------------------------------------------------------------
71 //------------------------------------------------------------------------------
72 void vvReadState::ReadTree()
76 while (!m_XmlReader->isEndElement() || value != "Images") {
77 m_XmlReader->readNext();
78 value = m_XmlReader->qualifiedName().toString().toStdString();
79 if (m_XmlReader->isStartElement()) {
80 if (value == "Image") value = ReadImage();
84 if (m_XmlReader->hasError())
85 std::cout << "Error " << m_XmlReader->error() << " XML " << std::endl;
87 //------------------------------------------------------------------------------
90 //------------------------------------------------------------------------------
91 std::string vvReadState::ReadImage()
94 int current_index = -1;
95 std::vector<std::string> files(1);
97 QXmlStreamAttributes attributes = m_XmlReader->attributes();
98 if (!m_XmlReader->hasError())
99 current_index = attributes.value("Index").toString().toInt();
101 current_index += m_TreeItemCount;
103 while (!m_XmlReader->isEndElement() || value != "Image") {
104 m_XmlReader->readNext();
105 value = m_XmlReader->qualifiedName().toString().toStdString();
106 if (m_XmlReader->isStartElement()) {
107 if (value == "FileName") {
108 files[0] = m_XmlReader->readElementText().toStdString();
109 if (!m_XmlReader->hasError()) {
110 m_Window->LoadImages(files, vvImageReader::IMAGE);
113 else if (current_index >= 0) {
114 vvSlicerManager* slicerManager = m_Window->GetSlicerManagers()[current_index];
115 if (value == "Preset") {
116 double vali = m_XmlReader->readElementText().toInt();
117 if (!m_XmlReader->hasError())
118 slicerManager->SetPreset(vali);
120 else if (value == "Window") {
121 double vald = m_XmlReader->readElementText().toDouble();
122 if (!m_XmlReader->hasError())
123 slicerManager->SetColorWindow(vald);
125 else if (value == "Level") {
126 double vald = m_XmlReader->readElementText().toDouble();
127 if (!m_XmlReader->hasError())
128 slicerManager->SetColorLevel(vald);
130 else if (value == "Fusion")
131 value = ReadFusion(current_index);
132 else if (value == "Overlay")
133 value = ReadOverlay(current_index);
134 else if (value == "Vector")
135 value = ReadVector(current_index);
140 if (!m_XmlReader->hasError())
145 //------------------------------------------------------------------------------
148 //------------------------------------------------------------------------------
149 std::string vvReadState::ReadFusion(int index)
151 std::string file, value;
154 vvSlicerManager* slicerManager = m_Window->GetSlicerManagers()[index];
155 while (!m_XmlReader->isEndElement() || value != "Fusion") {
156 m_XmlReader->readNext();
157 value = m_XmlReader->qualifiedName().toString().toStdString();
158 if (m_XmlReader->isStartElement()) {
159 if (value == "FileName") {
160 file = m_XmlReader->readElementText().toStdString();
161 if (!m_XmlReader->hasError())
162 m_Window->AddFusionImage(index, file.c_str());
164 if (value == "FusionOpacity") {
165 vali = m_XmlReader->readElementText().toInt();
166 if (!m_XmlReader->hasError())
167 slicerManager->SetFusionOpacity(vali);
169 if (value == "FusionThresholdOpacity") {
170 vali = m_XmlReader->readElementText().toInt();
171 if (!m_XmlReader->hasError())
172 slicerManager->SetFusionThresholdOpacity(vali);
174 if (value == "FusionColorMap") {
175 vali = m_XmlReader->readElementText().toInt();
176 if (!m_XmlReader->hasError())
177 slicerManager->SetFusionColorMap(vali);
179 if (value == "FusionWindow") {
180 vald = m_XmlReader->readElementText().toDouble();
181 if (!m_XmlReader->hasError())
182 slicerManager->SetFusionWindow(vald);
184 if (value == "FusionLevel") {
185 vald = m_XmlReader->readElementText().toDouble();
186 if (!m_XmlReader->hasError())
187 slicerManager->SetFusionLevel(vald);
191 m_Window->ImageInfoChanged();
194 //------------------------------------------------------------------------------
197 //------------------------------------------------------------------------------
198 std::string vvReadState::ReadOverlay(int index)
200 std::string file, value;
203 vvSlicerManager* slicerManager = m_Window->GetSlicerManagers()[index];
204 while (!m_XmlReader->isEndElement() || value != "Overlay") {
205 m_XmlReader->readNext();
206 value = m_XmlReader->qualifiedName().toString().toStdString();
207 if (m_XmlReader->isStartElement()) {
208 if (value == "FileName") {
209 file = m_XmlReader->readElementText().toStdString();
210 if (!m_XmlReader->hasError()) {
211 // TODO: manage sequence of images
212 std::vector<std::string> vec;
213 vec.push_back(file.c_str());
214 m_Window->AddOverlayImage(index, vec, vvImageReader::IMAGE);
217 if (value == "OverlayColorWindow") {
218 vald = m_XmlReader->readElementText().toDouble();
219 if (!m_XmlReader->hasError())
220 slicerManager->SetOverlayColorWindow(vald);
222 if (value == "OverlayColorLevel") {
223 vald = m_XmlReader->readElementText().toDouble();
224 if (!m_XmlReader->hasError())
225 slicerManager->SetOverlayColorLevel(vald);
227 if (value == "LinkOverlayWindowLevel") {
228 vali = m_XmlReader->readElementText().toInt();
229 if (!m_XmlReader->hasError())
230 slicerManager->SetLinkOverlayWindowLevel(vali);
232 if (value == "OverlayColor") {
233 vali = m_XmlReader->readElementText().toInt();
234 if (!m_XmlReader->hasError())
235 slicerManager->SetOverlayColor(vali);
239 m_Window->ImageInfoChanged();
242 //------------------------------------------------------------------------------
245 //------------------------------------------------------------------------------
246 std::string vvReadState::ReadVector(int index)
248 std::string file, value;
249 while (!m_XmlReader->isEndElement() || value != "Vector") {
250 m_XmlReader->readNext();
251 value = m_XmlReader->qualifiedName().toString().toStdString();
252 if (m_XmlReader->isStartElement()) {
253 if (value == "FileName") {
254 file = m_XmlReader->readElementText().toStdString();
255 if (!m_XmlReader->hasError())
256 m_Window->AddField(file.c_str(), index);
262 //------------------------------------------------------------------------------
265 //------------------------------------------------------------------------------
266 void vvReadState::ReadGUI()
270 //------------------------------------------------------------------------------
273 //------------------------------------------------------------------------------
274 void vvReadState::ReadTools()
278 while ((!m_XmlReader->hasError()) && (!m_XmlReader->isEndElement() || value != "Tools")) {
279 m_XmlReader->readNext();
280 value = m_XmlReader->qualifiedName().toString().toStdString();
281 if (value != "Tools") {
282 if (m_XmlReader->isStartElement()) {
288 if (m_XmlReader->hasError())
289 std::cout << "Error " << m_XmlReader->error() << " XML " << std::endl;
291 //------------------------------------------------------------------------------
294 //------------------------------------------------------------------------------
295 void vvReadState::ReadTool(const std::string & toolname)
297 // Find name into vvToolManager::GetInstance()->GetListOfTools();
298 vvToolCreatorBase * v = vvToolManager::GetInstance()->GetToolCreatorFromName(toolname.c_str());
300 std::cerr << "Error, I do not know the tool named '" << toolname << "' ; ignored." << std::endl;
301 std::string value="";
302 while (!m_XmlReader->isEndElement() || value != toolname) {
303 m_XmlReader->readNext();
304 value = m_XmlReader->qualifiedName().toString().toStdString();
305 if (m_XmlReader->hasError()) {
306 std::cout << "Error " << m_XmlReader->error() << " XML " << std::endl;
314 // std::vector<vvToolBaseBase*> & tools = v->GetListOfTool();
315 v->m_XmlReader = m_XmlReader;
316 v->mReadStateFlag = true;
317 v->mImageIndex = m_TreeItemCount;
318 v->MenuSpecificToolSlot();
319 v->mReadStateFlag = false;
320 m_XmlReader = v->m_XmlReader; // Need because auto_ptr operator= release on the right.
322 //------------------------------------------------------------------------------