Refactor dicomimageview

This commit is contained in:
Krad
2022-03-09 16:07:31 +08:00
parent 03a0b242f0
commit 33fcdc79e3
4 changed files with 386 additions and 405 deletions

View File

@@ -76,42 +76,6 @@ DicomImageView::~DicomImageView()
} }
} }
bool DicomImageView::isVCRVisible()
{
if (!_vcr_toolbar) return false;
return _vcr_toolbar->isVisible();
}
void DicomImageView::setVCRVisible(bool visible)
{
if (!_vcr_toolbar) return ;
_vcr_toolbar->setVisible(visible);
}
void DicomImageView::cineModeOn()
{
if (!_vcr_toolbar) return;
//updateVCRToolbarPos();
int ax = (this->geometry().bottomLeft().x() + this->geometry().bottomRight().x()) / 2 + VCRHelper::getVCRXOffset();
int ay = (this->geometry().bottomLeft().y() + this->geometry().bottomRight().y()) / 2 + VCRHelper::getVCRYOffset();
_vcr_toolbar->move(ax, ay);
_vcr_toolbar->show();
this->initCineModeThread();
_vcr_toolbar->reConnectController(_vcr_ctrl);
}
void DicomImageView::initCineModeThread()
{
_vcr_ctrl = new pqVCRController(nullptr, this);
_vcr_ctrl->moveToThread(&_thread);
connect(&_thread, &QThread::finished, _vcr_ctrl, &QObject::deleteLater);
_thread.start();
isCine = true;
}
MyTitleBar * DicomImageView::createMyTitleBar() MyTitleBar * DicomImageView::createMyTitleBar()
{ {
MyTitleBar *titleBar = new MyTitleBar(this); MyTitleBar *titleBar = new MyTitleBar(this);
@@ -120,117 +84,102 @@ MyTitleBar * DicomImageView::createMyTitleBar()
return titleBar; return titleBar;
} }
void DicomImageView::ToggleNegativeMode()
void DicomImageView::AddSlice(int step)
{ {
if (_ImageViewer == nullptr) if (HasSeries())
{ {
return; if (isNegative)
} {
if (HasSeries()) _ImageViewer->SetNegativeMode(false);
{ isNegative = false;
int curSlice = _ImageViewer->GetSlice() + step; }
_ImageViewer->SetSlice(curSlice); else
_scrollBar->setValue(curSlice); {
} _ImageViewer->SetNegativeMode(true);
isNegative = true;
}
}
} }
void DicomImageView::onFirstFrame() void DicomImageView::initScrollbar()
{ {
if (HasSeries()) { //_MinSlice = _ImageViewer->GetSliceMin();
_scrollBar->setValue(_ImageViewer->GetSliceMin()); //_MaxSlice = _ImageViewer->GetSliceMax();
} _scrollBar->setValue(_ImageViewer->GetSliceMin());
} _scrollBar->setMaximum(_ImageViewer->GetSliceMax());
void DicomImageView::onPreviousFrame() _scrollBar->setSingleStep(1);
{ _scrollBar->setVisible(true);
if (HasSeries()) {
int slice = _ImageViewer->GetSlice();
slice = slice--;
int min_slice = _ImageViewer->GetSliceMin();
if (slice < min_slice)
{
slice = _ImageViewer->GetSliceMax();
}
_scrollBar->setValue(slice);
}
}
void DicomImageView::onNextFrame()
{
if (HasSeries()) {
int slice = _ImageViewer->GetSlice();
slice = slice++;
int max_slice = _ImageViewer->GetSliceMax();
if (slice > max_slice)
{
slice = _ImageViewer->GetSliceMin();
}
_scrollBar->setValue(slice);
}
}
void DicomImageView::onLastFrame()
{
if (HasSeries()) {
_scrollBar->setValue(_ImageViewer->GetSliceMax());
}
} }
void DicomImageView::SetSlice(int slice) //NOTE: not working
{ void DicomImageView::setHighlight(bool yes) {
if (_ImageViewer == nullptr) _titleBar->SetHighlight(yes);
{
return;
}
if (HasSeries())
{
_ImageViewer->SetSlice(slice);
//_ImageViewer->updateCornerInfo(TOP_LEFT);
_scrollBar->setValue(slice);
}
} }
//SLOTS------------------------------------------------------------------------
void DicomImageView::Slot_scrollValueChanged(int slice) void DicomImageView::Slot_scrollValueChanged(int slice)
{ {
//if the scroll bar is activated by user, emit //if the scroll bar is activated by user, emit
//if the scroll bar is activated by program, no emit //if the scroll bar is activated by program, no emit
switch (_ScrollTriggerType) switch (_ScrollTriggerType)
{ {
case(scrollScope::TriggerType::USER_TRIGGER): case(scrollScope::TriggerType::USER_TRIGGER):
{ {
_ImageViewer->SetSlice(slice); //for interactor style use, reduce duplicate _ImageViewer->SetSlice(slice); //for interactor style use, reduce duplicate
// no break; // no break;
} }
case(scrollScope::TriggerType::STYLE_TRIGGER): case(scrollScope::TriggerType::STYLE_TRIGGER):
{ {
_ImageViewer->updateCornerInfo(TOP_LEFT); _ImageViewer->updateCornerInfo(TOP_LEFT);
//invoke event //invoke event
_SliceStep = slice - _PrevSlice; _SliceStep = slice - _PrevSlice;
_PrevSlice = slice; _PrevSlice = slice;
//emit Signal_scrollValueChanged(this, slice); //emit Signal_scrollValueChanged(this, slice);
int sliceArray[2]; int sliceArray[2];
sliceArray[0] = slice; sliceArray[0] = slice;
sliceArray[1] = _SliceStep; sliceArray[1] = _SliceStep;
this->Signal_SyncEvent(this, VTKIS_IMAGE_SLICING, sliceArray); this->Signal_SyncEvent(this, VTKIS_IMAGE_SLICING, sliceArray);
break; break;
} }
case(scrollScope::TriggerType::SYNC_ONLY): case(scrollScope::TriggerType::SYNC_ONLY):
{ {
_PrevSlice = slice; _PrevSlice = slice;
break; break;
} }
default: default:
break; break;
} }
} }
void DicomImageView::updateCornerInfoPrivacy()
void DicomImageView::Slot_ViewEmpty()
{ {
if (HasSeries()) emit Signal_ViewEmpty(this);
{
_ImageViewer->updateCornerInfo(TOP_RIGHT);
}
} }
void DicomImageView::Slot_viewDoubleclicked()
{
//emit Signal_ViewClicked(this);
emit Signal_viewDoubleclicked(this);
}
void DicomImageView::Slot_WindowLevelEventForFusion(double level, double width)
{
if (IsFusion()) {
_ImageViewer->SetFusionColorLeveL(level);
_ImageViewer->SetFusionColorWindow(width);
_ImageViewer->Render();
}
}
void DicomImageView::Slot_UpdateOrienInfo(TransFormType operation)
{
_ImageViewer->updateOrienInfo(operation);
}
//Widget event----------------------------------------------------------------
void DicomImageView::wheelEvent(QWheelEvent *event) void DicomImageView::wheelEvent(QWheelEvent *event)
{ {
if (HasSeries()) { if (HasSeries()) {
@@ -283,26 +232,12 @@ void DicomImageView::wheelEvent(QWheelEvent *event)
} }
} }
void DicomImageView::Slot_ViewEmpty()
{
emit Signal_ViewEmpty(this);
}
////-----------------------------------------------------------------------------
void DicomImageView::mousePressEvent(QMouseEvent* event) void DicomImageView::mousePressEvent(QMouseEvent* event)
{ {
emit Signal_ViewClicked(this); emit Signal_ViewClicked(this);
} }
void DicomImageView::Slot_viewDoubleclicked()
{
//emit Signal_ViewClicked(this);
emit Signal_viewDoubleclicked(this);
}
//-------------------------------------------------------
/** /**
* @brief DicomImageView::dragEnterEvent * @brief DicomImageView::dragEnterEvent
* 拖拽进入 * 拖拽进入
@@ -314,7 +249,6 @@ void DicomImageView::dragEnterEvent(QDragEnterEvent *e) {
} }
} }
//-------------------------------------------------------
/** /**
* @brief DicomImageView::dragMoveEvent * @brief DicomImageView::dragMoveEvent
* 拖拽移动 * 拖拽移动
@@ -326,7 +260,6 @@ void DicomImageView::dragMoveEvent(QDragMoveEvent *e) {
} }
} }
//-------------------------------------------------------
/** /**
* @brief DicomImageView::dropEvent * @brief DicomImageView::dropEvent
* 拖拽松开 * 拖拽松开
@@ -344,7 +277,7 @@ void DicomImageView::dropEvent(QDropEvent *e) {
} }
} }
} }
//-------------------------------------------------------
/** /**
* @brief DicomImageView::dragLeaveEvent * @brief DicomImageView::dragLeaveEvent
* 离开事件 * 离开事件
@@ -354,167 +287,31 @@ void DicomImageView::dragLeaveEvent(QDragLeaveEvent *) {
return; return;
} }
void DicomImageView::getWindowLevel(double &level, double &width) void DicomImageView::resizeEvent(QResizeEvent *event)
{ {
if (HasSeries()) { //auto size conner info
//_Series->getWindowLevel(level, width); if (!_ImageViewer) return;
level = _ImageViewer->GetColorLevel(); if (_ImageViewer->GetvtkCornerAnnotation()) {
width = _ImageViewer->GetColorWindow(); _ImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size()));
} _ImageViewer->Render();
}
if (isCine) {
int ax = (this->geometry().bottomLeft().x() + this->geometry().bottomRight().x()) / 2 +
VCRHelper::getVCRXOffset();
int ay = (this->geometry().bottomLeft().y() + this->geometry().bottomRight().y()) / 2 +
VCRHelper::getVCRYOffset();;
_vcr_toolbar->move(ax, ay);
}
} }
void DicomImageView::ToggleNegativeMode() //Fusion about -------------------------------------------------------------
{
if (HasSeries())
{
if (isNegative)
{
_ImageViewer->SetNegativeMode(false);
isNegative = false;
}
else
{
_ImageViewer->SetNegativeMode(true);
isNegative = true;
}
}
}
void DicomImageView::setWindowLevel(double level, double width)
{
if (HasSeries())
{
_ImageViewer->SetColorLevel(level);
_ImageViewer->SetColorWindow(width);
//You have to call updateConerInfo manually
//only mouse event can rely on callback
_ImageViewer->updateCornerInfo(BOTTOM_RIGHT);
emit Signal_WindowLevelEventForFusion(level, width);
}
}
void DicomImageView::initScrollbar()
{
//_MinSlice = _ImageViewer->GetSliceMin();
//_MaxSlice = _ImageViewer->GetSliceMax();
_scrollBar->setValue(_ImageViewer->GetSliceMin());
_scrollBar->setMaximum(_ImageViewer->GetSliceMax());
_scrollBar->setSingleStep(1);
_scrollBar->setVisible(true);
}
void DicomImageView::ResetPanZoom()
{
if (HasSeries())
{
//necessary to reset pan
_ImageViewer->GetRenderer()->ResetCamera();
//necessary to reset zoom
_ImageViewer->GetRenderer()->GetActiveCamera()->SetParallelScale(_Series->GetExtent());
}
}
void DicomImageView::ClearTransformations()
{
if (HasSeries())
{
int slice = _ImageViewer->GetSlice();
ResetPanZoom();
double cameraPosition[3];
double vup[3];
_Series->getCameraCfg(vup, cameraPosition);
//necessary to reset flip and rotate
_ImageViewer->GetRenderer()->GetActiveCamera()->SetPosition(cameraPosition);
_ImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(vup);
//avoid black out problem
_ImageViewer->GetRenderer()->ResetCameraClippingRange();
_ImageViewer->SetSlice(slice);
//Render
_ImageViewer->GetRenderWindow()->Render();
emit Signal_Transformation(CLEAR);
}
}
void DicomImageView::HFlip()
{
if (HasSeries()) {
int slice = _ImageViewer->GetSlice();
ResetPanZoom();
//HFlip
//_ImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0, 1, 0);
_ImageViewer->GetRenderer()->GetActiveCamera()->Azimuth(180);
FlipExportHelper::toggleFlip();
//to avoid black out problem during slicing
//slicing is related with rotation, you have to recalculate to get it right
_ImageViewer->GetRenderer()->ResetCameraClippingRange();
_ImageViewer->SetSlice(slice);
_ImageViewer->GetRenderWindow()->Render();
emit Signal_Transformation(H_FLIP);
}
}
void DicomImageView::VFlip()
{
if (HasSeries()) {
//double scale = _ImageViewer->GetRenderer()->GetActiveCamera()->GetParallelScale();
int slice = _ImageViewer->GetSlice();
ResetPanZoom();
//Method 2: Order matters
_ImageViewer->GetRenderer()->GetActiveCamera()->Elevation(-180);
_ImageViewer->GetRenderer()->GetActiveCamera()->Roll(180);
//_ImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0,-1,0);
FlipExportHelper::toggleFlip();
//to avoid black out problem during slicing
//slicing is related with rotation, you have to recalculate to get it right
_ImageViewer->GetRenderer()->ResetCameraClippingRange();
_ImageViewer->SetSlice(slice);
_ImageViewer->GetRenderWindow()->Render();
emit Signal_Transformation(V_FLIP);
}
}
void DicomImageView::Rotate(double angle, TransFormType operation)
{
if (HasSeries()) {
int slice = _ImageViewer->GetSlice();
ResetPanZoom();
_ImageViewer->GetRenderer()->GetActiveCamera()->Roll(angle);
//to avoid black out problem during slicing
//slcing is related with rotation, you have to recalculate to get it right
_ImageViewer->GetRenderer()->ResetCameraClippingRange();
_ImageViewer->SetSlice(slice);
_ImageViewer->GetRenderWindow()->Render();
emit Signal_Transformation(operation);
}
}
//NOTE: not working
void DicomImageView::setHighlight(bool yes) {
_titleBar->SetHighlight(yes);
}
bool DicomImageView::IsFusion() bool DicomImageView::IsFusion()
{ {
return _ImageViewer->GetFusion(); return _ImageViewer->GetFusion();
} }
void DicomImageView::SetFusionInput(DicomImageView *overlay) void DicomImageView::SetFusionInput(DicomImageView *overlay)
{ {
_overlay = overlay; _overlay = overlay;
@@ -523,7 +320,7 @@ void DicomImageView::SetFusionInput(DicomImageView *overlay)
double window; double window;
double level; double level;
_overlay->getWindowLevel(level, window); _overlay->GetWindowLevel(level, window);
_ImageViewer->FusionOn(); _ImageViewer->FusionOn();
_overlay->OverlayOn(); _overlay->OverlayOn();
@@ -545,15 +342,6 @@ void DicomImageView::SetFusionInput(DicomImageView *overlay)
} }
void DicomImageView::Slot_WindowLevelEventForFusion(double level, double width)
{
if (IsFusion()) {
_ImageViewer->SetFusionColorLeveL(level);
_ImageViewer->SetFusionColorWindow(width);
_ImageViewer->Render();
}
}
void DicomImageView::IncreFusionOpacity(double percent) { void DicomImageView::IncreFusionOpacity(double percent) {
if (IsFusion()) { if (IsFusion()) {
_ImageViewer->IncreFusionOpacity(percent); _ImageViewer->IncreFusionOpacity(percent);
@@ -561,7 +349,6 @@ void DicomImageView::IncreFusionOpacity(double percent) {
} }
} }
//@{
/** /**
* Remove Fusion no matter it is base or overlay * Remove Fusion no matter it is base or overlay
*/ */
@@ -598,43 +385,6 @@ void DicomImageView::removeFusion()
_overlay->OverlayOff(); _overlay->OverlayOff();
} }
void DicomImageView::ActiveMeasure(Measure *m)
{
if (nullptr != _Series)
{
_ImageViewer->ActiveMeasure(m);
}
}
void DicomImageView::DeleteSelectedMeasure()
{
if (nullptr != _Series)
{
_ImageViewer->DeleteSelectedMeasure();
}
}
void DicomImageView::DeleteCurrentSliceMeasure()
{
if (nullptr != _Series)
{
_ImageViewer->DeleteCurrentSliceMeasure();
}
}
void DicomImageView::DeleteCurrentSeriesMeasure()
{
if (nullptr != _Series)
{
_ImageViewer->DeleteCurrentSeriesMeasure();
}
}
void DicomImageView::removeViewWithMeasure()
{
_ImageViewer->UnActiveMeasure();
_ImageViewer->DeleteCurrentSeriesMeasure();
}
void DicomImageView::setDicomImageView(SeriesImageSet *series) void DicomImageView::setDicomImageView(SeriesImageSet *series)
{ {
if (!_ImageViewer){ if (!_ImageViewer){
@@ -644,7 +394,7 @@ void DicomImageView::setDicomImageView(SeriesImageSet *series)
_ImageViewer->SetupInteractor(m_glrenWin->GetInteractor()); _ImageViewer->SetupInteractor(m_glrenWin->GetInteractor());
} }
//series->setVTKOpenGLNativeWidget(this->_glView); //series->setVTKOpenGLNativeWidget(this->_glView);
CopyFromSeries(series); LoadSeries(series);
//whenver change instance,set scroll value to zero //whenver change instance,set scroll value to zero
initScrollbar(); initScrollbar();
@@ -657,29 +407,12 @@ bool DicomImageView::HasSeries()
return _Series ; return _Series ;
} }
void DicomImageView::Render() void DicomImageView::LoadSeries(SeriesImageSet *series)
{ {
if (HasSeries())
{
if (_ImageViewer->GetvtkCornerAnnotation()) {
_ImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size()));
}
_ImageViewer->Render();
}
}
void DicomImageView::CopyFromSeries(SeriesImageSet *series)
{
_Series = series; _Series = series;
_ImageViewer->SetInputData(_Series->GetData()); _ImageViewer->SetInputData(_Series->GetData());
_ImageViewer->initCornerInfo(series->GetProperty()); _ImageViewer->initCornerInfo(series->GetProperty());
_ImageViewer->setUpImageViewer(); _ImageViewer->setUpImageViewer();
//以下是一些转接函数 //以下是一些转接函数
//TODO: 考虑使用connect 替代 AddObserver,避免出现多种事件机制架构 //TODO: 考虑使用connect 替代 AddObserver,避免出现多种事件机制架构
connect(_ImageViewer->GetSignalRaiser(),&vtkSignalRaiser::raiseEvent, this, &DicomImageView::syncEventFunc); connect(_ImageViewer->GetSignalRaiser(),&vtkSignalRaiser::raiseEvent, this, &DicomImageView::syncEventFunc);
@@ -698,8 +431,6 @@ void DicomImageView::updateWindowLevelCb(vtkObject*caller, unsigned long eid, vo
emit Signal_WindowLevelEventForFusion(_ImageViewer->GetColorLevel(), _ImageViewer->GetColorWindow()); emit Signal_WindowLevelEventForFusion(_ImageViewer->GetColorLevel(), _ImageViewer->GetColorWindow());
} }
void DicomImageView::scalarEventCb(vtkObject* sender, unsigned long eventId, void* calldata) void DicomImageView::scalarEventCb(vtkObject* sender, unsigned long eventId, void* calldata)
{ {
double* r = (double*)calldata; double* r = (double*)calldata;
@@ -719,6 +450,7 @@ void DicomImageView::scalarEventCb(vtkObject* sender, unsigned long eventId, voi
break; break;
} }
} }
void DicomImageView::doubleclickedEventCb(vtkObject* sender, unsigned long eventId, void* calldata) { void DicomImageView::doubleclickedEventCb(vtkObject* sender, unsigned long eventId, void* calldata) {
emit Signal_viewDoubleclicked(this); emit Signal_viewDoubleclicked(this);
} }
@@ -781,14 +513,6 @@ int DicomImageView::getSeriesNumber()
return -1; return -1;
} }
void DicomImageView::updateCornerInfoAll()
{
if (HasSeries())
{
_ImageViewer->updateCornerInfoAll();
}
}
void DicomImageView::ShowMetaData() void DicomImageView::ShowMetaData()
{ {
@@ -813,25 +537,47 @@ void DicomImageView::ShowMetaData()
} }
} }
void DicomImageView::resizeEvent(QResizeEvent *event)
{
//auto size conner info
if (!_ImageViewer) return;
if (_ImageViewer->GetvtkCornerAnnotation()) {
_ImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size()));
_ImageViewer->Render();
}
if (isCine)
{
//if (_vcr_toolbar->isVisible())
//we see the mountains as moutains,hh
{
int ax = (this->geometry().bottomLeft().x() + this->geometry().bottomRight().x()) / 2 + VCRHelper::getVCRXOffset();
int ay = (this->geometry().bottomLeft().y() + this->geometry().bottomRight().y()) / 2 + VCRHelper::getVCRYOffset();;
_vcr_toolbar->move(ax, ay);
}
}
//--view about--------------------------------------------------------------------------------------
void DicomImageView::Render()
{
if (HasSeries())
{
if (_ImageViewer->GetvtkCornerAnnotation()) {
_ImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size()));
}
_ImageViewer->Render();
}
}
void DicomImageView::SetSlice(int slice)
{
if (_ImageViewer == nullptr)
{
return;
}
if (HasSeries())
{
_ImageViewer->SetSlice(slice);
//_ImageViewer->updateCornerInfo(TOP_LEFT);
_scrollBar->setValue(slice);
}
}
void DicomImageView::AddSlice(int step)
{
if (_ImageViewer == nullptr)
{
return;
}
if (HasSeries())
{
int curSlice = _ImageViewer->GetSlice() + step;
_ImageViewer->SetSlice(curSlice);
_scrollBar->setValue(curSlice);
}
} }
void DicomImageView::SetZoomScale(double scale) void DicomImageView::SetZoomScale(double scale)
@@ -853,8 +599,243 @@ void DicomImageView::SetPanOffset(double * pan)
} }
} }
void DicomImageView::ResetPanZoom()
void DicomImageView::Slot_UpdateOrienInfo(TransFormType operation)
{ {
_ImageViewer->updateOrienInfo(operation); if (HasSeries())
{
//necessary to reset pan
_ImageViewer->GetRenderer()->ResetCamera();
//necessary to reset zoom
_ImageViewer->GetRenderer()->GetActiveCamera()->SetParallelScale(_Series->GetExtent());
}
}
void DicomImageView::SetWindowLevel(double level, double width)
{
if (HasSeries())
{
_ImageViewer->SetColorLevel(level);
_ImageViewer->SetColorWindow(width);
//You have to call updateConerInfo manually
//only mouse event can rely on callback
_ImageViewer->updateCornerInfo(BOTTOM_RIGHT);
emit Signal_WindowLevelEventForFusion(level, width);
}
}
void DicomImageView::HFlip()
{
if (HasSeries()) {
int slice = _ImageViewer->GetSlice();
ResetPanZoom();
//HFlip
//_ImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0, 1, 0);
_ImageViewer->GetRenderer()->GetActiveCamera()->Azimuth(180);
FlipExportHelper::toggleFlip();
//to avoid black out problem during slicing
//slicing is related with rotation, you have to recalculate to get it right
_ImageViewer->GetRenderer()->ResetCameraClippingRange();
_ImageViewer->SetSlice(slice);
_ImageViewer->GetRenderWindow()->Render();
emit Signal_Transformation(H_FLIP);
}
}
void DicomImageView::VFlip()
{
if (HasSeries()) {
//double scale = _ImageViewer->GetRenderer()->GetActiveCamera()->GetParallelScale();
int slice = _ImageViewer->GetSlice();
ResetPanZoom();
//Method 2: Order matters
_ImageViewer->GetRenderer()->GetActiveCamera()->Elevation(-180);
_ImageViewer->GetRenderer()->GetActiveCamera()->Roll(180);
//_ImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0,-1,0);
FlipExportHelper::toggleFlip();
//to avoid black out problem during slicing
//slicing is related with rotation, you have to recalculate to get it right
_ImageViewer->GetRenderer()->ResetCameraClippingRange();
_ImageViewer->SetSlice(slice);
_ImageViewer->GetRenderWindow()->Render();
emit Signal_Transformation(V_FLIP);
}
}
void DicomImageView::Rotate(double angle, TransFormType operation)
{
if (HasSeries()) {
int slice = _ImageViewer->GetSlice();
ResetPanZoom();
_ImageViewer->GetRenderer()->GetActiveCamera()->Roll(angle);
//to avoid black out problem during slicing
//slcing is related with rotation, you have to recalculate to get it right
_ImageViewer->GetRenderer()->ResetCameraClippingRange();
_ImageViewer->SetSlice(slice);
_ImageViewer->GetRenderWindow()->Render();
emit Signal_Transformation(operation);
}
}
void DicomImageView::ClearTransformations()
{
if (HasSeries())
{
int slice = _ImageViewer->GetSlice();
ResetPanZoom();
double cameraPosition[3];
double vup[3];
_Series->getCameraCfg(vup, cameraPosition);
//necessary to reset flip and rotate
_ImageViewer->GetRenderer()->GetActiveCamera()->SetPosition(cameraPosition);
_ImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(vup);
//avoid black out problem
_ImageViewer->GetRenderer()->ResetCameraClippingRange();
_ImageViewer->SetSlice(slice);
//Render
_ImageViewer->GetRenderWindow()->Render();
emit Signal_Transformation(CLEAR);
}
}
void DicomImageView::updateCornerInfoAll()
{
if (HasSeries())
{
_ImageViewer->updateCornerInfoAll();
}
}
void DicomImageView::updateCornerInfoPrivacy()
{
if (HasSeries())
{
_ImageViewer->updateCornerInfo(TOP_RIGHT);
}
}
//--VCR about------------------------------------------------------------------
bool DicomImageView::isVCRVisible()
{
if (!_vcr_toolbar) return false;
return _vcr_toolbar->isVisible();
}
void DicomImageView::setVCRVisible(bool visible)
{
if (!_vcr_toolbar) return ;
_vcr_toolbar->setVisible(visible);
}
void DicomImageView::cineModeOn()
{
if (!_vcr_toolbar) return;
//updateVCRToolbarPos();
int ax = (this->geometry().bottomLeft().x() + this->geometry().bottomRight().x()) / 2 + VCRHelper::getVCRXOffset();
int ay = (this->geometry().bottomLeft().y() + this->geometry().bottomRight().y()) / 2 + VCRHelper::getVCRYOffset();
_vcr_toolbar->move(ax, ay);
_vcr_toolbar->show();
this->initCineModeThread();
_vcr_toolbar->reConnectController(_vcr_ctrl);
}
void DicomImageView::initCineModeThread()
{
_vcr_ctrl = new pqVCRController(nullptr, this);
_vcr_ctrl->moveToThread(&_thread);
connect(&_thread, &QThread::finished, _vcr_ctrl, &QObject::deleteLater);
_thread.start();
isCine = true;
}
void DicomImageView::onFirstFrame()
{
if (HasSeries()) {
_scrollBar->setValue(_ImageViewer->GetSliceMin());
}
}
void DicomImageView::onPreviousFrame()
{
if (HasSeries()) {
int slice = _ImageViewer->GetSlice();
slice = slice--;
int min_slice = _ImageViewer->GetSliceMin();
if (slice < min_slice)
{
slice = _ImageViewer->GetSliceMax();
}
_scrollBar->setValue(slice);
}
}
void DicomImageView::onNextFrame()
{
if (HasSeries()) {
int slice = _ImageViewer->GetSlice();
slice = slice++;
int max_slice = _ImageViewer->GetSliceMax();
if (slice > max_slice)
{
slice = _ImageViewer->GetSliceMin();
}
_scrollBar->setValue(slice);
}
}
void DicomImageView::onLastFrame()
{
if (HasSeries()) {
_scrollBar->setValue(_ImageViewer->GetSliceMax());
}
}
//-- Measure about--------------------------------------------------------------------------------------
void DicomImageView::ActiveMeasure(Measure *m)
{
if (nullptr != _Series)
{
_ImageViewer->ActiveMeasure(m);
}
}
void DicomImageView::DeleteSelectedMeasure()
{
if (nullptr != _Series)
{
_ImageViewer->DeleteSelectedMeasure();
}
}
void DicomImageView::DeleteCurrentSliceMeasure()
{
if (nullptr != _Series)
{
_ImageViewer->DeleteCurrentSliceMeasure();
}
}
void DicomImageView::DeleteCurrentSeriesMeasure()
{
if (nullptr != _Series)
{
_ImageViewer->DeleteCurrentSeriesMeasure();
}
}
void DicomImageView::removeViewWithMeasure()
{
_ImageViewer->UnActiveMeasure();
_ImageViewer->DeleteCurrentSeriesMeasure();
} }

View File

@@ -68,8 +68,8 @@ public:
void updateCornerInfoPrivacy(); void updateCornerInfoPrivacy();
//Window level //Window level
void getWindowLevel(double &level, double &width); void GetWindowLevel(double &level, double &width);
void setWindowLevel(double level, double width); void SetWindowLevel(double level, double width);
//Transformation //Transformation
void ClearTransformations(); void ClearTransformations();
@@ -208,7 +208,7 @@ private:
void ResetPanZoom(); void ResetPanZoom();
void initScrollbar(); void initScrollbar();
void CopyFromSeries(SeriesImageSet *series); void LoadSeries(SeriesImageSet *series);
vtkSmartPointer <vtkGenericOpenGLRenderWindow> m_glrenWin; vtkSmartPointer <vtkGenericOpenGLRenderWindow> m_glrenWin;

View File

@@ -30,7 +30,7 @@ void Customwindow::setCurrentView(DicomImageView *cur)
} }
double width = 0; double width = 0;
double level = 0; double level = 0;
m_curV->getWindowLevel(level, width); m_curV->GetWindowLevel(level, width);
ui.led_WL->setText(QString("%1").arg(level)); ui.led_WL->setText(QString("%1").arg(level));
ui.led_WW->setText(QString("%1").arg(width)); ui.led_WW->setText(QString("%1").arg(width));
} }
@@ -38,6 +38,6 @@ void Customwindow::setCurrentView(DicomImageView *cur)
void Customwindow::onBtnOKClicked() void Customwindow::onBtnOKClicked()
{ {
m_curV->setWindowLevel(ui.led_WL->text().toDouble(), ui.led_WW->text().toDouble()); m_curV->SetWindowLevel(ui.led_WL->text().toDouble(), ui.led_WW->text().toDouble());
this->close(); this->close();
} }

View File

@@ -164,7 +164,7 @@ void ViewContainerWidget::Slot_SyncEvent(DicomImageView *view, int interactionMo
{ {
double *d = (double *)calldata; double *d = (double *)calldata;
printf("EndWindowLevel, scale param:%f,%f \r\n", d[0], d[1]); printf("EndWindowLevel, scale param:%f,%f \r\n", d[0], d[1]);
v->setWindowLevel(d[1], d[0]); v->SetWindowLevel(d[1], d[0]);
} }
} }
} }