]> Creatis software - clitk.git/commitdiff
Update Landmark coordinates with transformation matrix
authortbaudier <thomas.baudier@creatis.insa-lyon.fr>
Tue, 24 Jan 2017 14:59:06 +0000 (15:59 +0100)
committertbaudier <thomas.baudier@creatis.insa-lyon.fr>
Tue, 24 Jan 2017 14:59:06 +0000 (15:59 +0100)
vv/qt_ui/vvLandmarksPanel.ui
vv/vvLandmarks.cxx
vv/vvLandmarks.h
vv/vvLandmarksPanel.cxx
vv/vvLandmarksPanel.h
vv/vvMainWindow.cxx
vv/vvSlicerManager.cxx
vv/vvSlicerManager.h

index 9337b52c96c3c8207add01903bb37cdf393bfb73..8744627113d32d94945be5ae599fb61e25863493 100644 (file)
@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>325</width>
+    <width>382</width>
     <height>214</height>
    </rect>
   </property>
    <string>Form</string>
   </property>
   <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0" colspan="-1">
-    <widget class="QLabel" name="nameLabel">
-     <property name="text">
-      <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
-p, li { white-space: pre-wrap; }
-&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
-&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;CurrentImage :&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
-     </property>
-    </widget>
-   </item>
    <item row="1" column="0" colspan="2">
     <widget class="QLabel" name="label">
      <property name="text">
@@ -139,6 +129,27 @@ p, li { white-space: pre-wrap; }
      </property>
     </widget>
    </item>
+   <item row="0" column="0" colspan="5">
+    <widget class="QLabel" name="nameLabel">
+     <property name="text">
+      <string>&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;CurrentImage :&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="3" colspan="2">
+    <widget class="QPushButton" name="updateTransformButton">
+     <property name="text">
+      <string>Update Coords.</string>
+     </property>
+     <property name="icon">
+      <iconset resource="../vvIcons.qrc">
+       <normaloff>:/common/icons/rotateright.png</normaloff>:/common/icons/rotateright.png</iconset>
+     </property>
+    </widget>
+   </item>
   </layout>
  </widget>
  <resources>
index dc38cd228f69b27981960e24b220bf3fafa5c4eb..a2686835befd9295ce000e89d34c3f6fbdac28e7 100644 (file)
 vvLandmarks::vvLandmarks(int size)
 {
   mLandmarks.resize(size);
+  mLandmarksInitial.resize(size);
   mFilenames.resize(0);
   mTime = 0;
 
   for (int i = 0; i < size; i++) {
     mLandmarks[i].resize(0);
+    mLandmarksInitial[i].resize(0);
     vtkPoints *points = vtkPoints::New();
     mPoints.push_back(points);
     mIds.push_back(vtkFloatArray::New());
@@ -79,6 +81,7 @@ void vvLandmarks::AddLandmark(float x,float y,float z,float t,double value)
   point.coordinates[3] = t;
   point.pixel_value=value;
   mLandmarks[mTime].push_back(point);
+  mLandmarksInitial[mTime].push_back(point);
 
   idPoint = mPoints[int(t)]->InsertNextPoint(x,y,z);
   std::string str_vtkIdType;       // string which will contain the result
@@ -103,6 +106,27 @@ void vvLandmarks::AddLandmark(float x,float y,float z,float t,double value)
 }
 //--------------------------------------------------------------------
 
+//--------------------------------------------------------------------
+void vvLandmarks::TransformUpdate(vtkAbstractTransform* transform)
+{
+  //For all Time, For all landmarks, I apply the transform
+  for(int time=0; time<mLandmarks.size(); ++time)
+  {
+    for(int landmark=0; landmark<mLandmarks[time].size(); ++landmark)
+    {
+      double ptBeforeTransform[3], ptAfterTransform[3];
+      ptBeforeTransform[0]= mLandmarksInitial[time][landmark].coordinates[0];
+      ptBeforeTransform[1]= mLandmarksInitial[time][landmark].coordinates[1];
+      ptBeforeTransform[2]= mLandmarksInitial[time][landmark].coordinates[2];
+      transform->TransformPoint(ptBeforeTransform, ptAfterTransform);
+
+      mLandmarks[time][landmark].coordinates[0]= ptAfterTransform[0];
+      mLandmarks[time][landmark].coordinates[1]= ptAfterTransform[1];
+      mLandmarks[time][landmark].coordinates[2]= ptAfterTransform[2];
+    }
+  }
+}
+//--------------------------------------------------------------------
 
 //--------------------------------------------------------------------
 void vvLandmarks::RemoveLastLandmark()
@@ -110,6 +134,7 @@ void vvLandmarks::RemoveLastLandmark()
   mPoints[mTime]->SetNumberOfPoints(mPoints[mTime]->GetNumberOfPoints()-1);
   //  mText.pop_back();
   mLandmarks[mTime].pop_back();
+  mLandmarksInitial[mTime].pop_back();
   mIds[mTime]->RemoveLastTuple();
   mLabels[mTime]->SetNumberOfValues(mLabels[mTime]->GetNumberOfValues()-1);
   mLabels[mTime]->Modified();
@@ -148,6 +173,7 @@ void vvLandmarks::RemoveLandmarkWithLabel(vtkStdString label, int time)
   mPolyData->Modified();
 
   mLandmarks[t].erase(mLandmarks[t].begin() + index);
+  mLandmarksInitial[t].erase(mLandmarksInitial[t].begin() + index);
   mIds[t]->RemoveLastTuple();
 }
 //--------------------------------------------------------------------
@@ -175,6 +201,7 @@ void vvLandmarks::RemoveLandmark(int index)
   mPolyData->Modified();
 
   mLandmarks[t].erase(mLandmarks[t].begin() + index);
+  mLandmarksInitial[t].erase(mLandmarksInitial[t].begin() + index);
   mIds[t]->RemoveLastTuple();
 }
 //--------------------------------------------------------------------
@@ -184,6 +211,7 @@ void vvLandmarks::RemoveAll()
 {
   for (unsigned int i = 0; i < mLandmarks.size(); i++) {
     mLandmarks[i].clear();
+    mLandmarksInitial[i].clear();
     mPoints[i]->SetNumberOfPoints(0);
     mLabels[i]->SetNumberOfValues(0);
     mIds[i]->SetNumberOfValues(0);
@@ -195,6 +223,7 @@ void vvLandmarks::RemoveAll()
 void vvLandmarks::ChangeComments(int index, std::string comments)
 {
   mLandmarks[mTime][index].comments = comments;
+  mLandmarksInitial[mTime][index].comments = comments;
 }
 //--------------------------------------------------------------------
 
@@ -242,6 +271,7 @@ bool vvLandmarks::LoadTxtFile(std::vector<std::string> filenames)
   mFilenames = filenames;
   for (unsigned int i = 0; i < mPoints.size(); i++) {
     mLandmarks[i].clear();
+    mLandmarksInitial[i].clear();
     mPoints[i]->SetNumberOfPoints(0);
   }
 
@@ -333,6 +363,7 @@ bool vvLandmarks::LoadTxtFile(std::vector<std::string> filenames)
         }
         //      DD(point.comments);
         mLandmarks[int(point.coordinates[3])].push_back(point);
+        mLandmarksInitial[int(point.coordinates[3])].push_back(point);
         mIds[int(point.coordinates[3])]->InsertNextTuple1(0.55);
         idPoint = mPoints[int(point.coordinates[3])]->InsertNextPoint(
                                                             point.coordinates[0],point.coordinates[1],point.coordinates[2]);
@@ -361,6 +392,7 @@ bool vvLandmarks::LoadPtsFile(std::vector<std::string> filenames)
   for (unsigned int i = 0; i < mPoints.size(); i++) {
     mPoints[i]->SetNumberOfPoints(0);
     mLandmarks[i].clear();
+    mLandmarksInitial[i].clear();
   }
 
   int err = 0;
@@ -415,6 +447,7 @@ bool vvLandmarks::LoadPtsFile(std::vector<std::string> filenames)
 
         //      DD(point.comments);
         mLandmarks[int(point.coordinates[3])].push_back(point);
+        mLandmarksInitial[int(point.coordinates[3])].push_back(point);
         mIds[int(point.coordinates[3])]->InsertNextTuple1(0.55);
         idPoint = mPoints[int(point.coordinates[3])]->InsertNextPoint(
                                                             point.coordinates[0],point.coordinates[1],point.coordinates[2]);
index 6f7e91ff99c6635f83303c0e69c7c924a887c745..285b24a741033d30cd8be685d5a88c38d1397bc8 100644 (file)
@@ -25,6 +25,7 @@
 #include "vtkPoints.h"
 #include "vvLandmarksGlyph.h"
 #include "vtkStringArray.h"
+#include <vtkAbstractTransform.h>
 
 //typedef
 struct vvLandmark {
@@ -43,6 +44,7 @@ public :
     void SaveFile(std::string filename);
 
     void AddLandmark(float x,float y,float z,float t,double value);
+    void TransformUpdate(vtkAbstractTransform* transform);
     void RemoveLastLandmark();
     void RemoveLandmarkWithLabel(vtkStdString, int);
     void RemoveLandmark(int index);
@@ -71,6 +73,7 @@ private:
     
     typedef std::vector<vvLandmark> LandmarkContainerType;
     std::vector<LandmarkContainerType> mLandmarks;
+    std::vector<LandmarkContainerType> mLandmarksInitial;
     
     vtkPolyData *mPolyData;
     std::vector<vtkPoints*> mPoints;
index f23631cb1ca734fd41e3e946145c0bb64ceb6563..827e391a474ac637b819392fec8c254cdcbfbf51 100644 (file)
@@ -38,9 +38,11 @@ vvLandmarksPanel::vvLandmarksPanel(QWidget * parent):QWidget(parent)
   tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
   loadButton->setEnabled(0);
   saveButton->setEnabled(0);
+  updateTransformButton->setEnabled(0);
   removeButton->setEnabled(0);
   connect(loadButton, SIGNAL(clicked()),this,SLOT(Load()));
   connect(saveButton, SIGNAL(clicked()),this,SLOT(Save()));
+  connect(updateTransformButton, SIGNAL(clicked()),this,SLOT(UpdateTransform()));
   connect(removeButton, SIGNAL(clicked()),this,SLOT(RemoveSelectedPoints()));
   connect(removeAllButton, SIGNAL(clicked()),this,SLOT(RemoveAllPoints()));
   connect(tableWidget,SIGNAL(cellChanged(int,int)),this,SLOT(CommentsChanged(int,int)));
@@ -80,6 +82,12 @@ void vvLandmarksPanel::Save()
   }
 }
 
+void vvLandmarksPanel::UpdateTransform()
+{
+  emit UpdateLandmarkTransform();
+  SetCurrentLandmarks(mCurrentLandmarks,mCurrentLandmarks->GetTime());
+}
+
 void vvLandmarksPanel::SelectPoint()
 { 
   if (tableWidget->rowCount() > 0) {
@@ -181,6 +189,7 @@ void vvLandmarksPanel::SetCurrentLandmarks(vvLandmarks* lm,int time)
     return;
   loadButton->setEnabled(1);
   saveButton->setEnabled(1);
+  updateTransformButton->setEnabled(1);
   removeButton->setEnabled(1);
   mCurrentLandmarks = lm;
   tableWidget->clearContents();
index 01f53994ce67b0c604e8325199a9fca4f21f6f5e..3d9b45cbd38d2020b0cf71accb6fc52ae50685cf 100644 (file)
@@ -44,6 +44,7 @@ public slots:
     void Load();
     bool LoadFromFile(std::vector<std::string> file);
     void Save();
+    void UpdateTransform();
     void RemoveSelectedPoints();
     void RemoveAllPoints();
     void AddPoint();
@@ -52,6 +53,7 @@ public slots:
 signals:
     void UpdateRenderWindows();
     void SelectedPointChanged();
+    void UpdateLandmarkTransform();
 
 private:
     void AddPoint(int);
index e70269cbda681d32292cb37f291d633f65546ed9..a3d2000cbd9da993edcd9adccbd3b1130eaf9358 100644 (file)
@@ -984,6 +984,7 @@ void vvMainWindow::LoadImages(std::vector<std::string> files, vvImageReader::Loa
         connect(mSlicerManagers.back(), SIGNAL(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)),
           this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)));
         connect(mSlicerManagers.back(),SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
+        connect(landmarksPanel,SIGNAL(UpdateLandmarkTransform()), mSlicerManagers.back(), SLOT(UpdateLandmark()));
         InitSlicers();
         numberofsuccesulreads++;
       }
@@ -3697,6 +3698,7 @@ vvSlicerManager* vvMainWindow::AddImage(vvImage::Pointer image,std::string filen
   connect(mSlicerManagers.back(), SIGNAL(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)),
     this,SLOT(ChangeImageWithIndexOffset(vvSlicerManager*,int,int)));
   connect(mSlicerManagers.back(), SIGNAL(LandmarkAdded()),landmarksPanel,SLOT(AddPoint()));
+  connect(landmarksPanel,SIGNAL(UpdateLandmarkTransform()), mSlicerManagers.back(), SLOT(UpdateLandmark()));
 
 
 
index e9d1c215fc91b4f6886e74c343bf8c2eddbe5c47..139c8089afc5d8a61d07db22f7d11c75e787a7d8 100644 (file)
@@ -1625,6 +1625,13 @@ void vvSlicerManager::AddLandmarkProfile(float x,float y,float z,float t)
 }
 //----------------------------------------------------------------------------
 
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateLandmark()
+{
+    this->GetLandmarks()->TransformUpdate(mSlicers[mSelectedSlicer]->GetConcatenatedTransform()->GetInverse());
+}
+//----------------------------------------------------------------------------
+
 //----------------------------------------------------------------------------
 void vvSlicerManager::PrevImage(int slicer)
 { 
index e80ef485f8e54ea9de07b18957b04db35531b039..0d5c9aee218eacc9be8b615a1ce98608ce8d4eed 100644 (file)
@@ -285,6 +285,7 @@ class vvSlicerManager : public QObject {
 
 public slots:
   void AddLandmark(float x,float y,float z,float t);
+  void UpdateLandmark();
 
 signals :
   void callAddLandmark(float x,float y,float z,float t);