Use SyncSlicePoint instead of SyncSliceWithPage.

This commit is contained in:
Krad
2022-05-05 16:06:38 +08:00
parent dc4215b1c3
commit 54dd173a60
6 changed files with 95 additions and 47 deletions

View File

@@ -1,4 +1,4 @@
#include "base/SeriesImageSet.h"
#include "base/SeriesImageSet.h"
#include <vtkRendererCollection.h>
#include "view/dicomimageview.h"
#include "base/DicomLoader.h"
@@ -51,18 +51,33 @@ const char *SeriesImageSet::getStudyUID() const {
}
bool SeriesImageSet::IntersectWorldBounds(SeriesImageSet *imageSet) {
double originOffset[3] = {.0, .0, .0};
for (int i = 0; i < 3; ++i) {
originOffset[i] = GetProperty()->GetPosition()[i] - imageSet->GetProperty()->GetPosition()[i];
}
double adjustBounds[6] ={.0,.0,.0,.0,.0,.0};
GetData()->GetBounds(adjustBounds);
for (int j = 0; j < 6; ++j) {
adjustBounds[j] = adjustBounds[j] + originOffset[j/2];
}
double bounds[6] ={.0,.0,.0,.0,.0,.0};
imageSet->GetData()->GetBounds(bounds);
double minP[4] ={bounds[0],bounds[2], bounds[4], 1.0};
double maxP[4] ={bounds[1],bounds[3], bounds[5], 1.0};
imageSet->GetProperty()->GetModelToWorldMatrix()->MultiplyPoint(minP,minP);
imageSet->GetProperty()->GetModelToWorldMatrix()->MultiplyPoint(maxP,maxP);
bounds[0] = min(minP[0],maxP[0]);
bounds[1] = max(minP[0],maxP[0]);
bounds[2] = min(minP[1],maxP[1]);
bounds[3] = max(minP[1],maxP[1]);
bounds[4] = min(minP[2],maxP[2]);
bounds[5] = max(minP[2],maxP[2]);
double cBounds[6] ={.0,.0,.0,.0,.0,.0};
GetData()->GetBounds(cBounds);
double minP2[4] ={cBounds[0], cBounds[2], cBounds[4], 1.0};
double maxP2[4] ={cBounds[1], cBounds[3], cBounds[5], 1.0};
GetProperty()->GetModelToWorldMatrix()->MultiplyPoint(minP2,minP2);
GetProperty()->GetModelToWorldMatrix()->MultiplyPoint(maxP2,maxP2);
cBounds[0] = min(minP2[0], maxP2[0]);
cBounds[1] = max(minP2[0],maxP2[0]);
cBounds[2] = min(minP2[1], maxP2[1]);
cBounds[3] = max(minP2[1], maxP2[1]);
cBounds[4] = min(minP2[2], maxP2[2]);
cBounds[5] = max(minP2[2], maxP2[2]);
vtkBoundingBox box1;
box1.SetBounds(adjustBounds);
box1.SetBounds(bounds);
vtkBoundingBox box2;
box2.SetBounds(imageSet->GetData()->GetBounds());
box2.SetBounds(cBounds);
return box1.IntersectBox(box2);
}

View File

@@ -628,7 +628,31 @@ void infinitiViewer::ChangeSlice(vtkObject *, unsigned long eventid, void *calld
}
void infinitiViewer::SyncSlicePoint(double * point) {
//TODO:SyncSlicePoint with different series in same study
double focusPoint[4] = {.0, .0, .0, 1.0};
focusPoint[0] = point[0] - imageDataOrigin[0];
focusPoint[1] = point[1] - imageDataOrigin[1];
focusPoint[2] = point[2] - imageDataOrigin[2];
matrix->Invert();
matrix->MultiplyPoint(focusPoint, focusPoint);
matrix->Invert();
double f[3] = {.0, .0, .0};
Renderer->GetActiveCamera()->GetFocalPoint(f);
double bounds[6] = {.0, .0, .0, .0, .0, .0};
ImageMapper->GetBounds(bounds);
f[SliceOrientation] = focusPoint[SliceOrientation];
Renderer->GetActiveCamera()->SetFocalPoint(f);
}
void infinitiViewer::GetSlicePoint(double * point) {
double focusPoint[4] = {.0, .0, .0, 1.0};
Renderer->GetActiveCamera()->GetFocalPoint(focusPoint);
matrix->MultiplyPoint(focusPoint, focusPoint);
focusPoint[0] += imageDataOrigin[0];
focusPoint[1] += imageDataOrigin[1];
focusPoint[2] += imageDataOrigin[2];
point[0] = focusPoint[0];
point[1] = focusPoint[1];
point[2] = focusPoint[2];
}
vtkSmartPointer<vtkPoints> infinitiViewer::GetSliceBoundPoints(){
@@ -1055,7 +1079,7 @@ vtkTypeBool infinitiViewer::GetOffScreenRendering()
void infinitiViewer::SetInputData(vtkImageData* in)
{
#ifdef _DEBUG
printf("fusion origin:%f,%f,%f", in->GetOrigin()[0], in->GetOrigin()[1], in->GetOrigin()[2]);
printf("fusion imageDataOrigin:%f,%f,%f", in->GetOrigin()[0], in->GetOrigin()[1], in->GetOrigin()[2]);
printf("fusion spacing:%f,%f,%f", in->GetSpacing()[0], in->GetSpacing()[1], in->GetSpacing()[2]);
#endif
this->FirstRender = 1;
@@ -1362,17 +1386,22 @@ void infinitiViewer::initCornerInfo(ExtendMedicalImageProperties* pSeries)
matrix->Zero();
matrix->SetElement(0, 0, xVector[0]);
matrix->SetElement(0, 1, xVector[1]);
matrix->SetElement(0, 2, xVector[2]);
matrix->SetElement(1, 0, yVector[0]);
matrix->SetElement(1, 1, yVector[1]);
matrix->SetElement(1, 2, yVector[2]);
matrix->SetElement(2, 0, zVector[0]);
matrix->SetElement(2, 1, zVector[1]);
matrix->SetElement(2, 2, zVector[2]);
matrix->SetElement(3, 3, 1);
matrix->Invert();
matrix->SetElement( 0,0, xVector[0]);
matrix->SetElement( 1,0, xVector[1]);
matrix->SetElement( 2,0, xVector[2]);
matrix->SetElement( 0,1, yVector[0]);
matrix->SetElement( 1,1, yVector[1]);
matrix->SetElement( 2,1, yVector[2]);
matrix->SetElement( 0,2, zVector[0]);
matrix->SetElement( 1,2, zVector[1]);
matrix->SetElement( 2,2, zVector[2]);
matrix->SetElement( 3,3, 1);
// matrix->Invert();
double* p = pSeries->GetPosition();
imageDataOrigin[0] = p[0];
imageDataOrigin[1] = p[1];
imageDataOrigin[2] = p[2];
}
int getOrientationIndex(double* v){
@@ -1467,3 +1496,4 @@ int infinitiViewer::GetWorldSliceOrientation() {
matrix->MultiplyPoint(orientations, orientations);
return (int)abs(round(1.0 * orientations[1]) + round(2.0 * orientations[2]));
}

View File

@@ -323,6 +323,7 @@ public:
return &raiser;
}
void SyncSlicePoint(double* point);
void GetSlicePoint(double* point);
protected:
infinitiViewer();
@@ -370,11 +371,6 @@ protected:
void RemoveMeasures(vtkObject*,unsigned long eventid,void* calldata );
private:
void updateTopLeftCornerInfo();
infinitiViewer(const infinitiViewer&) = delete;
void operator=(const infinitiViewer&) = delete;
std::vector<std::vector<double>> fusion_tf_vector;
@@ -387,10 +383,10 @@ private:
void raiseEvent(vtkObject* sender,unsigned long eventId,void* callData = nullptr){
raiser.raiseEvent(sender,eventId,callData);
}
void ClearCurrentSliceMeasure() const;
void ReloadCurrentSliceMeasure();
void updateTopLeftCornerInfo();
vtkNew<RulerLegendActor> ruler;
bool rulerActive = false;
void RenderRuler();
@@ -399,6 +395,7 @@ private:
int viewRightIndex = 1;
DicomCornerInfo m_cornerInfo;
char SOP_UID[20]={0};
double imageDataOrigin[3] = {.0, .0, .0};
vtkNew<vtkMatrix4x4> matrix;
};

View File

@@ -1,4 +1,4 @@
#include "view/dicomimageview.h"
#include "view/dicomimageview.h"
#include <QMessageBox>
#include <QDebug>
#include "view/thumbnailImage.h"
@@ -111,16 +111,12 @@ void DicomImageView::Slot_scrollValueChanged(int slice)
}
case(scrollScope::TriggerType::STYLE_TRIGGER):
{
qDebug()<<"======>>";
_ImageViewer->updateCornerInfo(TOP_LEFT);
//invoke event
_SliceStep = slice - _PrevSlice;
_PrevSlice = slice;
//emit Signal_scrollValueChanged(this, slice);
int sliceArray[2];
sliceArray[0] = slice;
sliceArray[1] = _SliceStep;
this->Signal_SyncEvent(this, VTKIS_IMAGE_SLICING, sliceArray);
double focusPoint[3] = {.0, .0, .0};
_ImageViewer->GetSlicePoint(focusPoint);
this->Signal_SyncEvent(this, VTKIS_IMAGE_SLICING, focusPoint);
break;
}
case(scrollScope::TriggerType::SYNC_ONLY):
@@ -847,3 +843,10 @@ int DicomImageView::GetSliceOrientation() {
void DicomImageView::viewerClicked() {
emit Signal_ViewClicked(this);
}
void DicomImageView::SyncScrollBar() {
setScrollChangedType(scrollScope::TriggerType::SYNC_ONLY);
_scrollBar->setValue(_ImageViewer->GetSlice());
_ImageViewer->updateCornerInfo(TOP_LEFT);
setScrollChangedType(scrollScope::TriggerType::USER_TRIGGER);
}

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include <QFrame>
#include <QOpenGLWidget>
#include "ClickableScrollBar.h"
@@ -98,6 +98,7 @@ public:
void SetSlice(int slice);
void SetZoomScale(double scale);
void SetPanOffset(double * p);
void SyncScrollBar();
//CineMode
void onFirstFrame();
@@ -130,7 +131,10 @@ public:
bool CompareWorldSliceOrientation(DicomImageView* view){
return this->_ImageViewer->GetWorldSliceOrientation() == view->_ImageViewer->GetWorldSliceOrientation();
}
void SyncSlicePoint(double* point){
_ImageViewer->SyncSlicePoint(point);
_ImageViewer->Render();
}
signals:
/**
* This signal will be emitted whenever a mouse event occurs within the QVTK window.

View File

@@ -70,10 +70,9 @@ void ViewContainerWidget::Slot_SyncEvent(DicomImageView *view, int interactionMo
{
manager.smartDo([](auto v,auto callData){
if (v->HasSeries()) {
int *r = (int *) callData;
v->setScrollChangedType(scrollScope::TriggerType::SYNC_ONLY);
v->SetSlice(r[0]);
v->setScrollChangedType(scrollScope::TriggerType::USER_TRIGGER);
double* r = (double*) callData;
v->SyncSlicePoint(r);
v->SyncScrollBar();
}
},view, calldata,ImageViewManager::EStudyEBoundsSeries);
}