|
|
|
|
@@ -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 *titleBar = new MyTitleBar(this);
|
|
|
|
|
@@ -120,76 +84,41 @@ MyTitleBar * DicomImageView::createMyTitleBar()
|
|
|
|
|
return titleBar;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void DicomImageView::AddSlice(int step)
|
|
|
|
|
void DicomImageView::ToggleNegativeMode()
|
|
|
|
|
{
|
|
|
|
|
if (_ImageViewer == nullptr)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (HasSeries())
|
|
|
|
|
{
|
|
|
|
|
int curSlice = _ImageViewer->GetSlice() + step;
|
|
|
|
|
_ImageViewer->SetSlice(curSlice);
|
|
|
|
|
_scrollBar->setValue(curSlice);
|
|
|
|
|
if (isNegative)
|
|
|
|
|
{
|
|
|
|
|
_ImageViewer->SetNegativeMode(false);
|
|
|
|
|
isNegative = false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_ImageViewer->SetNegativeMode(true);
|
|
|
|
|
isNegative = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DicomImageView::onFirstFrame()
|
|
|
|
|
void DicomImageView::initScrollbar()
|
|
|
|
|
{
|
|
|
|
|
if (HasSeries()) {
|
|
|
|
|
//_MinSlice = _ImageViewer->GetSliceMin();
|
|
|
|
|
//_MaxSlice = _ImageViewer->GetSliceMax();
|
|
|
|
|
_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());
|
|
|
|
|
}
|
|
|
|
|
_scrollBar->setMaximum(_ImageViewer->GetSliceMax());
|
|
|
|
|
_scrollBar->setSingleStep(1);
|
|
|
|
|
_scrollBar->setVisible(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DicomImageView::SetSlice(int slice)
|
|
|
|
|
{
|
|
|
|
|
if (_ImageViewer == nullptr)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (HasSeries())
|
|
|
|
|
{
|
|
|
|
|
//NOTE: not working
|
|
|
|
|
void DicomImageView::setHighlight(bool yes) {
|
|
|
|
|
_titleBar->SetHighlight(yes);
|
|
|
|
|
|
|
|
|
|
_ImageViewer->SetSlice(slice);
|
|
|
|
|
//_ImageViewer->updateCornerInfo(TOP_LEFT);
|
|
|
|
|
_scrollBar->setValue(slice);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//SLOTS------------------------------------------------------------------------
|
|
|
|
|
void DicomImageView::Slot_scrollValueChanged(int slice)
|
|
|
|
|
{
|
|
|
|
|
//if the scroll bar is activated by user, emit
|
|
|
|
|
@@ -224,13 +153,33 @@ void DicomImageView::Slot_scrollValueChanged(int slice)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
void DicomImageView::updateCornerInfoPrivacy()
|
|
|
|
|
|
|
|
|
|
void DicomImageView::Slot_ViewEmpty()
|
|
|
|
|
{
|
|
|
|
|
if (HasSeries())
|
|
|
|
|
emit Signal_ViewEmpty(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DicomImageView::Slot_viewDoubleclicked()
|
|
|
|
|
{
|
|
|
|
|
_ImageViewer->updateCornerInfo(TOP_RIGHT);
|
|
|
|
|
//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)
|
|
|
|
|
{
|
|
|
|
|
if (HasSeries()) {
|
|
|
|
|
@@ -283,26 +232,12 @@ void DicomImageView::wheelEvent(QWheelEvent *event)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void DicomImageView::Slot_ViewEmpty()
|
|
|
|
|
{
|
|
|
|
|
emit Signal_ViewEmpty(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////-----------------------------------------------------------------------------
|
|
|
|
|
void DicomImageView::mousePressEvent(QMouseEvent* event)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
emit Signal_ViewClicked(this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DicomImageView::Slot_viewDoubleclicked()
|
|
|
|
|
{
|
|
|
|
|
//emit Signal_ViewClicked(this);
|
|
|
|
|
emit Signal_viewDoubleclicked(this);
|
|
|
|
|
}
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
|
/**
|
|
|
|
|
* @brief DicomImageView::dragEnterEvent
|
|
|
|
|
* 拖拽进入
|
|
|
|
|
@@ -314,7 +249,6 @@ void DicomImageView::dragEnterEvent(QDragEnterEvent *e) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
|
/**
|
|
|
|
|
* @brief DicomImageView::dragMoveEvent
|
|
|
|
|
* 拖拽移动
|
|
|
|
|
@@ -326,7 +260,6 @@ void DicomImageView::dragMoveEvent(QDragMoveEvent *e) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
|
/**
|
|
|
|
|
* @brief DicomImageView::dropEvent
|
|
|
|
|
* 拖拽松开
|
|
|
|
|
@@ -344,7 +277,7 @@ void DicomImageView::dropEvent(QDropEvent *e) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief DicomImageView::dragLeaveEvent
|
|
|
|
|
* 离开事件
|
|
|
|
|
@@ -354,167 +287,31 @@ void DicomImageView::dragLeaveEvent(QDragLeaveEvent *) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DicomImageView::getWindowLevel(double &level, double &width)
|
|
|
|
|
void DicomImageView::resizeEvent(QResizeEvent *event)
|
|
|
|
|
{
|
|
|
|
|
if (HasSeries()) {
|
|
|
|
|
//_Series->getWindowLevel(level, width);
|
|
|
|
|
level = _ImageViewer->GetColorLevel();
|
|
|
|
|
width = _ImageViewer->GetColorWindow();
|
|
|
|
|
//auto size conner info
|
|
|
|
|
if (!_ImageViewer) return;
|
|
|
|
|
if (_ImageViewer->GetvtkCornerAnnotation()) {
|
|
|
|
|
_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()
|
|
|
|
|
{
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
//Fusion about -------------------------------------------------------------
|
|
|
|
|
bool DicomImageView::IsFusion()
|
|
|
|
|
{
|
|
|
|
|
return _ImageViewer->GetFusion();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DicomImageView::SetFusionInput(DicomImageView *overlay)
|
|
|
|
|
{
|
|
|
|
|
_overlay = overlay;
|
|
|
|
|
@@ -523,7 +320,7 @@ void DicomImageView::SetFusionInput(DicomImageView *overlay)
|
|
|
|
|
|
|
|
|
|
double window;
|
|
|
|
|
double level;
|
|
|
|
|
_overlay->getWindowLevel(level, window);
|
|
|
|
|
_overlay->GetWindowLevel(level, window);
|
|
|
|
|
|
|
|
|
|
_ImageViewer->FusionOn();
|
|
|
|
|
_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) {
|
|
|
|
|
if (IsFusion()) {
|
|
|
|
|
_ImageViewer->IncreFusionOpacity(percent);
|
|
|
|
|
@@ -561,7 +349,6 @@ void DicomImageView::IncreFusionOpacity(double percent) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//@{
|
|
|
|
|
/**
|
|
|
|
|
* Remove Fusion no matter it is base or overlay
|
|
|
|
|
*/
|
|
|
|
|
@@ -598,43 +385,6 @@ void DicomImageView::removeFusion()
|
|
|
|
|
_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)
|
|
|
|
|
{
|
|
|
|
|
if (!_ImageViewer){
|
|
|
|
|
@@ -644,7 +394,7 @@ void DicomImageView::setDicomImageView(SeriesImageSet *series)
|
|
|
|
|
_ImageViewer->SetupInteractor(m_glrenWin->GetInteractor());
|
|
|
|
|
}
|
|
|
|
|
//series->setVTKOpenGLNativeWidget(this->_glView);
|
|
|
|
|
CopyFromSeries(series);
|
|
|
|
|
LoadSeries(series);
|
|
|
|
|
//whenver change instance,set scroll value to zero
|
|
|
|
|
initScrollbar();
|
|
|
|
|
|
|
|
|
|
@@ -657,29 +407,12 @@ bool DicomImageView::HasSeries()
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
_ImageViewer->SetInputData(_Series->GetData());
|
|
|
|
|
_ImageViewer->initCornerInfo(series->GetProperty());
|
|
|
|
|
_ImageViewer->setUpImageViewer();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//以下是一些转接函数
|
|
|
|
|
//TODO: 考虑使用connect 替代 AddObserver,避免出现多种事件机制架构
|
|
|
|
|
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());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void DicomImageView::scalarEventCb(vtkObject* sender, unsigned long eventId, void* calldata)
|
|
|
|
|
{
|
|
|
|
|
double* r = (double*)calldata;
|
|
|
|
|
@@ -719,6 +450,7 @@ void DicomImageView::scalarEventCb(vtkObject* sender, unsigned long eventId, voi
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DicomImageView::doubleclickedEventCb(vtkObject* sender, unsigned long eventId, void* calldata) {
|
|
|
|
|
emit Signal_viewDoubleclicked(this);
|
|
|
|
|
}
|
|
|
|
|
@@ -781,14 +513,6 @@ int DicomImageView::getSeriesNumber()
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DicomImageView::updateCornerInfoAll()
|
|
|
|
|
{
|
|
|
|
|
if (HasSeries())
|
|
|
|
|
{
|
|
|
|
|
_ImageViewer->updateCornerInfoAll();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DicomImageView::ShowMetaData()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
@@ -813,25 +537,47 @@ void DicomImageView::ShowMetaData()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DicomImageView::resizeEvent(QResizeEvent *event)
|
|
|
|
|
|
|
|
|
|
//--view about--------------------------------------------------------------------------------------
|
|
|
|
|
void DicomImageView::Render()
|
|
|
|
|
{
|
|
|
|
|
if (HasSeries())
|
|
|
|
|
{
|
|
|
|
|
//auto size conner info
|
|
|
|
|
if (!_ImageViewer) return;
|
|
|
|
|
if (_ImageViewer->GetvtkCornerAnnotation()) {
|
|
|
|
|
_ImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size()));
|
|
|
|
|
}
|
|
|
|
|
_ImageViewer->Render();
|
|
|
|
|
}
|
|
|
|
|
if (isCine)
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DicomImageView::SetSlice(int slice)
|
|
|
|
|
{
|
|
|
|
|
//if (_vcr_toolbar->isVisible())
|
|
|
|
|
//we see the mountains as moutains,hh
|
|
|
|
|
if (_ImageViewer == nullptr)
|
|
|
|
|
{
|
|
|
|
|
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);
|
|
|
|
|
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)
|
|
|
|
|
@@ -853,8 +599,243 @@ void DicomImageView::SetPanOffset(double * pan)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void DicomImageView::Slot_UpdateOrienInfo(TransFormType operation)
|
|
|
|
|
void DicomImageView::ResetPanZoom()
|
|
|
|
|
{
|
|
|
|
|
_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();
|
|
|
|
|
}
|