]> Creatis software - clitk.git/blobdiff - vv/vvReadState.cxx
Debug RTStruct conversion with empty struc
[clitk.git] / vv / vvReadState.cxx
index 6ad544b17f990bb65d134ccc2c3af1ad30e5bcc0..6a248b2b82b23d456146fb79687c8212ddf1902b 100644 (file)
@@ -1,5 +1,26 @@
+/*=========================================================================
+  Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
+
+  Authors belong to:
+  - University of LYON              http://www.universite-lyon.fr/
+  - Léon Bérard cancer center       http://www.centreleonberard.fr
+  - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
+
+  This software is distributed WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  PURPOSE.  See the copyright notices for more information.
+
+  It is distributed under dual licence
+
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+  ===========================================================================**/
+
 #include "vvReadState.h"
 #include "vvMainWindow.h"
+#include "vvSlicerManager.h"
+#include "vvToolCreatorBase.h"
+#include "vvToolBaseBase.h"
 
 #include <qtreewidget.h>
 
 #include <cassert>
 #include <string>
 
+//------------------------------------------------------------------------------
 vvReadState::vvReadState() : m_XmlReader(new QXmlStreamReader), m_File(new QFile)
 {
+  m_NumImages = 0;
 }
+//------------------------------------------------------------------------------
+
 
+//------------------------------------------------------------------------------
 vvReadState::~vvReadState()
 {
 }
+//------------------------------------------------------------------------------
 
+
+//------------------------------------------------------------------------------
 void vvReadState::Run(vvMainWindow* vvWindow, const std::string& file)
 {
   assert(vvWindow);
 
+  m_NumImages = 0;
   m_File->setFileName(file.c_str());
   m_File->open(QIODevice::ReadOnly);
   m_XmlReader->setDevice(m_File.get());
   m_Window = vvWindow;
   QTreeWidget* tree = m_Window->GetTree();
+
+  // Get the number of images already loaded
   m_TreeItemCount = tree->topLevelItemCount();
 
+  // Read elements
   ReadGUI();
   ReadTree();
+  ReadTools();
 }
+//------------------------------------------------------------------------------
+
 
+//------------------------------------------------------------------------------
 void vvReadState::ReadTree()
 {
   std::string value;
   
-  while (!m_XmlReader->atEnd()) {
+  // read images
+  while (!m_XmlReader->isEndElement() || value != "Images") { 
     m_XmlReader->readNext();
     value = m_XmlReader->qualifiedName().toString().toStdString();
     if (m_XmlReader->isStartElement()) {
-      if (value == "Image") 
-        value = ReadImage();
+      if (value == "Image") value = ReadImage();
     } 
   }
   
+  // read links
+  while (!m_XmlReader->isEndElement() || value != "Links") { 
+    m_XmlReader->readNext();
+    value = m_XmlReader->qualifiedName().toString().toStdString();
+    if (m_XmlReader->isStartElement()) {
+      if (value == "LinkedFrom") value = ReadLink();
+    } 
+  }
+
   if (m_XmlReader->hasError())
     std::cout << "Error " << m_XmlReader->error() << " XML " << std::endl;
 }
+//------------------------------------------------------------------------------
+
 
+//------------------------------------------------------------------------------
 std::string  vvReadState::ReadImage()
 {
   std::string value;
@@ -64,7 +113,6 @@ std::string  vvReadState::ReadImage()
   while (!m_XmlReader->isEndElement() || value != "Image") { 
     m_XmlReader->readNext();
     value = m_XmlReader->qualifiedName().toString().toStdString();
-    //std::cout << "Value = " << value << std::endl;
     if (m_XmlReader->isStartElement()) {
       if (value == "FileName") {
         files[0] = m_XmlReader->readElementText().toStdString();
@@ -73,7 +121,23 @@ std::string  vvReadState::ReadImage()
         }
       }
       else if (current_index >= 0) {
-        if (value == "Fusion") 
+        vvSlicerManager* slicerManager = m_Window->GetSlicerManagers()[current_index];
+        if (value == "Preset") {
+          double vali = m_XmlReader->readElementText().toInt();
+          if (!m_XmlReader->hasError())
+            slicerManager->SetPreset(vali);
+        }
+        else if (value == "Window") {
+          double vald = m_XmlReader->readElementText().toDouble();
+          if (!m_XmlReader->hasError())
+            slicerManager->SetColorWindow(vald);
+        }
+        else if (value == "Level") {
+          double vald = m_XmlReader->readElementText().toDouble();
+          if (!m_XmlReader->hasError())
+            slicerManager->SetColorLevel(vald);
+        }
+        else if (value == "Fusion")
           value = ReadFusion(current_index);
         else if (value == "Overlay")
           value = ReadOverlay(current_index);
@@ -82,44 +146,117 @@ std::string  vvReadState::ReadImage()
       }
     }
   }
+  
+  if (!m_XmlReader->hasError())
+    m_NumImages++;
 
   return value;
 }
+//------------------------------------------------------------------------------
 
+
+//------------------------------------------------------------------------------
 std::string vvReadState::ReadFusion(int index)
 {
   std::string file, value;
+  int vali;
+  double vald;
+  vvSlicerManager* slicerManager = m_Window->GetSlicerManagers()[index];
   while (!m_XmlReader->isEndElement() || value != "Fusion") {
     m_XmlReader->readNext();
     value = m_XmlReader->qualifiedName().toString().toStdString();
     if (m_XmlReader->isStartElement()) {
       if (value == "FileName") {
         file = m_XmlReader->readElementText().toStdString();
+        if (!m_XmlReader->hasError()) {
+          // TODO: manage sequence of images
+          std::vector<std::string> vec;
+          vec.push_back(file.c_str());
+          m_Window->AddFusionImage(index, vec, vvImageReader::IMAGE);
+        }
+      }
+      if (value == "FusionOpacity") {
+        vali = m_XmlReader->readElementText().toInt();
+        if (!m_XmlReader->hasError())
+          slicerManager->SetFusionOpacity(vali);
+      }
+      if (value == "FusionThresholdOpacity") {
+        vali = m_XmlReader->readElementText().toInt();
+        if (!m_XmlReader->hasError())
+          slicerManager->SetFusionThresholdOpacity(vali);
+      }
+      if (value == "FusionColorMap") {
+        vali = m_XmlReader->readElementText().toInt();
+        if (!m_XmlReader->hasError())
+          slicerManager->SetFusionColorMap(vali);
+      }
+      if (value == "FusionWindow") {
+        vald = m_XmlReader->readElementText().toDouble();
         if (!m_XmlReader->hasError())
-          m_Window->AddFusionImage(index, file.c_str());
+          slicerManager->SetFusionWindow(vald);
+      }
+      if (value == "FusionLevel") {
+        vald = m_XmlReader->readElementText().toDouble();
+        if (!m_XmlReader->hasError())
+          slicerManager->SetFusionLevel(vald);
       }
     }
   }
+  m_Window->ImageInfoChanged();
   return value;
 }
+//------------------------------------------------------------------------------
+
 
+//------------------------------------------------------------------------------
 std::string vvReadState::ReadOverlay(int index)
 {
   std::string file, value;
+  int vali;
+  double vald;
+  vvSlicerManager* slicerManager = m_Window->GetSlicerManagers()[index];
   while (!m_XmlReader->isEndElement() || value != "Overlay") {
     m_XmlReader->readNext();
     value = m_XmlReader->qualifiedName().toString().toStdString();
     if (m_XmlReader->isStartElement()) {
       if (value == "FileName") {
         file = m_XmlReader->readElementText().toStdString();
+        if (!m_XmlReader->hasError()) {
+          // TODO: manage sequence of images
+          std::vector<std::string> vec;
+          vec.push_back(file.c_str());
+          m_Window->AddOverlayImage(index, vec, vvImageReader::IMAGE);
+        }
+      }
+      if (value == "OverlayColorWindow") {
+        vald = m_XmlReader->readElementText().toDouble();
+        if (!m_XmlReader->hasError())
+          slicerManager->SetOverlayColorWindow(vald);
+      }
+      if (value == "OverlayColorLevel") {
+        vald = m_XmlReader->readElementText().toDouble();
+        if (!m_XmlReader->hasError())
+          slicerManager->SetOverlayColorLevel(vald);
+      }
+      if (value == "LinkOverlayWindowLevel") {
+        vali = m_XmlReader->readElementText().toInt();
         if (!m_XmlReader->hasError())
-          m_Window->AddOverlayImage(index, file.c_str());
+          slicerManager->SetLinkOverlayWindowLevel(vali);
+      }
+      if (value == "OverlayColor") {
+        vali = m_XmlReader->readElementText().toInt();
+        if (!m_XmlReader->hasError())
+          slicerManager->SetOverlayColor(vali);
       }
     }
   }
+  m_Window->ImageInfoChanged();
   return value;
 }
+//------------------------------------------------------------------------------
+
 
+//------------------------------------------------------------------------------
 std::string vvReadState::ReadVector(int index)
 {
   std::string file, value;
@@ -136,9 +273,91 @@ std::string vvReadState::ReadVector(int index)
   }
   return value;
 }
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+std::string  vvReadState::ReadLink()
+{
+  std::string id_from, id_to, value;
+  
+  QXmlStreamAttributes attributes = m_XmlReader->attributes();
+  if (!m_XmlReader->hasError()) {
+    id_from = attributes.value("Id").toString().toStdString();
+  }
+
+  while (!m_XmlReader->isEndElement() || value != "LinkedFrom") { 
+    m_XmlReader->readNext();
+    value = m_XmlReader->qualifiedName().toString().toStdString();
+    if (m_XmlReader->isStartElement()) {
+      if (value == "LinkedTo") {
+        id_to = m_XmlReader->readElementText().toStdString();
+        if (!m_XmlReader->hasError()) {
+          m_Window->AddLink(id_from.c_str(), id_to.c_str(), false);
+        }
+      }
+    }
+  }
+  
+  return value;
+}
+//------------------------------------------------------------------------------
 
+//------------------------------------------------------------------------------
 void vvReadState::ReadGUI()
 {
 
 }
+//------------------------------------------------------------------------------
 
+
+//------------------------------------------------------------------------------
+void vvReadState::ReadTools()
+{
+  std::string value;
+  
+  while ((!m_XmlReader->hasError()) && (!m_XmlReader->isEndElement() || value != "Tools")) { 
+    m_XmlReader->readNext();
+    value = m_XmlReader->qualifiedName().toString().toStdString();
+    if (value != "Tools") {
+      if (m_XmlReader->isStartElement()) {
+        ReadTool(value);
+      } 
+    }
+  }
+  
+  if (m_XmlReader->hasError())
+    std::cout << "Error " << m_XmlReader->error() << " XML " << std::endl;
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvReadState::ReadTool(const std::string & toolname)
+{
+  // Find name into vvToolManager::GetInstance()->GetListOfTools();
+  vvToolCreatorBase * v = vvToolManager::GetInstance()->GetToolCreatorFromName(toolname.c_str());
+  if (v == NULL) {
+    std::cerr << "Error, I do not know the tool named '" << toolname << "' ; ignored." << std::endl;
+    std::string value="";
+    while (!m_XmlReader->isEndElement() || value != toolname) { 
+      m_XmlReader->readNext();
+      value = m_XmlReader->qualifiedName().toString().toStdString();
+      if (m_XmlReader->hasError()) {
+        std::cout << "Error " << m_XmlReader->error() << " XML " << std::endl;
+        return;
+      }
+    }
+    return;
+  }
+
+  // CreateTool
+  // std::vector<vvToolBaseBase*> & tools = v->GetListOfTool();
+  v->m_XmlReader = m_XmlReader;
+  v->mReadStateFlag = true;
+  v->mImageIndex = m_TreeItemCount;
+  v->MenuSpecificToolSlot();
+  v->mReadStateFlag = false;
+  m_XmlReader = v->m_XmlReader; // Need because auto_ptr operator= release on the right.
+}
+//------------------------------------------------------------------------------