Refactor dicomimageview. 2

This commit is contained in:
Krad
2022-07-01 17:11:29 +08:00
parent cad3c89fb8
commit 8b4afe9e6d
8 changed files with 483 additions and 576 deletions

View File

@@ -63,7 +63,7 @@ void ExportDialog::onBtnExportClicked()
//export files //export files
if (ui->rbCurrentImage->isChecked())//current image if (ui->rbCurrentImage->isChecked())//current image
{ {
if (cur_view->HasSeries()) if (cur_view->hasSeries())
{ {
QString imageName(cur_view->getSeriesInstance()->getCurImageName()); QString imageName(cur_view->getSeriesInstance()->getCurImageName());
options.inputData.push_back(imageName); options.inputData.push_back(imageName);
@@ -71,7 +71,7 @@ void ExportDialog::onBtnExportClicked()
} }
else if (ui->rbCurrentSeries->isChecked())//current series else if (ui->rbCurrentSeries->isChecked())//current series
{ {
if (cur_view->HasSeries()) if (cur_view->hasSeries())
{ {
QString serieName(cur_view->getSeriesInstance()->getSeriesName()); QString serieName(cur_view->getSeriesInstance()->getSeriesName());
options.inputData.push_back(serieName); options.inputData.push_back(serieName);

View File

@@ -41,7 +41,7 @@ void ImageViewManager::smartDo(SmartDoCallback cb, DicomImageView *sourceView, v
std::for_each(vList.begin(),vList.end(),[=](auto v){ std::for_each(vList.begin(),vList.end(),[=](auto v){
//check series //check series
auto series = sourceView->getSeriesInstance(); auto series = sourceView->getSeriesInstance();
if (v->getSeriesInstance()==series && v->GetSliceOrientation() == sourceView->GetSliceOrientation()){ if (v->getSeriesInstance()==series && v->getSliceOrientation() == sourceView->getSliceOrientation()){
cb(v, callData); cb(v, callData);
} }
@@ -51,14 +51,14 @@ void ImageViewManager::smartDo(SmartDoCallback cb, DicomImageView *sourceView, v
case DoScope::EStudyEBoundsSeries:{ case DoScope::EStudyEBoundsSeries:{
std::for_each(vList.begin(),vList.end(),[=](auto v) { std::for_each(vList.begin(),vList.end(),[=](auto v) {
if (v == sourceView) return; if (v == sourceView) return;
if (!v->HasSeries()) return; if (!v->hasSeries()) return;
//check series //check series
auto series = sourceView->getSeriesInstance(); auto series = sourceView->getSeriesInstance();
auto currentSeries = v->getSeriesInstance(); auto currentSeries = v->getSeriesInstance();
//same series //same series
if (series == currentSeries if (series == currentSeries
//equal slice orientation //equal slice orientation
&& v->GetSliceOrientation() == sourceView->GetSliceOrientation()) { && v->getSliceOrientation() == sourceView->getSliceOrientation()) {
cb(v, callData); cb(v, callData);
} }
//equal study //equal study

View File

@@ -18,8 +18,12 @@
#include "dcmtk/dcmdata/dcfilefo.h" #include "dcmtk/dcmdata/dcfilefo.h"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
DicomImageView::DicomImageView(QWidget* parent) DicomImageView::DicomImageView(QWidget *parent)
: QFrame(parent) : QFrame(parent), mGLRenWin(vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New()), mImageViewer(nullptr),
mSeries(nullptr), mScrollBar(new ClickableScrollBar(Qt::Orientation::Vertical, this)),
mTitleBar(createMyTitleBar()), mGLWidget(new QVTKOpenGLNativeWidget), mVcrController(nullptr),
mOverlayView(nullptr), mBaseView(nullptr), mSliceOrientation(2), mIsCine(false), mIsNegative(false),
mIsOverlay(false), mIsSlotInited(false)
{ {
//main container //main container
QFrame *wrapper = new QFrame(this); QFrame *wrapper = new QFrame(this);
@@ -28,7 +32,6 @@ DicomImageView::DicomImageView(QWidget* parent)
QGridLayout *view_layout = new QGridLayout(this); QGridLayout *view_layout = new QGridLayout(this);
//add container and title bar //add container and title bar
mTitleBar = createMyTitleBar();
view_layout->addWidget(mTitleBar, 0, 0); view_layout->addWidget(mTitleBar, 0, 0);
view_layout->addWidget(wrapper, 1, 0); view_layout->addWidget(wrapper, 1, 0);
view_layout->setContentsMargins(0, 0, 0, 0); view_layout->setContentsMargins(0, 0, 0, 0);
@@ -36,22 +39,18 @@ DicomImageView::DicomImageView(QWidget* parent)
this->setLayout(view_layout); this->setLayout(view_layout);
// create layout for main container // create layout for main container
QGridLayout* controlLayout = new QGridLayout(wrapper); QGridLayout *controlLayout = new QGridLayout(wrapper);
mGLWidget = new QVTKOpenGLNativeWidget(wrapper); mGLWidget->setParent(wrapper);
mGLWidget->SetRenderWindow(mGLRenWin);
//add QVTKOpenGLNativeWidget to container
mGLRenWin = vtkSmartPointer <vtkGenericOpenGLRenderWindow>::New();
mGLWidget->SetRenderWindow(mGLRenWin);//set up interacte
controlLayout->addWidget(mGLWidget, 0, 0); controlLayout->addWidget(mGLWidget, 0, 0);
//add scrollbar to container //add scrollbar to container
mScrollBar = new ClickableScrollBar(Qt::Orientation::Vertical, this);
mScrollBar->setSingleStep(1); mScrollBar->setSingleStep(1);
mScrollBar->setFocusPolicy(Qt::StrongFocus); mScrollBar->setFocusPolicy(Qt::StrongFocus);
mScrollBar->setVisible(false); mScrollBar->setVisible(false);
mScrollBar->setObjectName("scrollbar"); mScrollBar->setObjectName("scrollbar");
controlLayout->addWidget(mScrollBar, 0, 1); controlLayout->addWidget(mScrollBar, 0, 1);
connect(mScrollBar, &ClickableScrollBar::clicked, this, &DicomImageView::viewerClicked); connect(mScrollBar, &ClickableScrollBar::clicked, this, &DicomImageView::clicked);
//config container UI //config container UI
controlLayout->setContentsMargins(0, 0, 0, 0); controlLayout->setContentsMargins(0, 0, 0, 0);
@@ -64,30 +63,27 @@ DicomImageView::DicomImageView(QWidget* parent)
this->setObjectName("dicomview"); this->setObjectName("dicomview");
} }
//----------------------------------------------------------------------------- DicomImageView::~DicomImageView() {
DicomImageView::~DicomImageView() if (mImageViewer) {
{
if (mImageViewer){
mImageViewer->Delete(); mImageViewer->Delete();
mImageViewer = nullptr; mImageViewer = nullptr;
} }
mVcrControlThread.quit();//event loop mVcrControlThread.quit();//event loop
mVcrControlThread.wait(); //wait until return,block mode mVcrControlThread.wait(); //wait until return,block mode
if (mVcrToolbar){ if (mVcrToolbar) {
mVcrToolbar->deleteLater(); mVcrToolbar->deleteLater();
} }
} }
MyTitleBar * DicomImageView::createMyTitleBar() // layout about---------------------------------------------------------------
{ MyTitleBar *DicomImageView::createMyTitleBar() {
MyTitleBar *titleBar = new MyTitleBar(this); MyTitleBar *titleBar = new MyTitleBar(this);
connect(titleBar, &MyTitleBar::signalButtonMaxClicked, this, &DicomImageView::Slot_viewDoubleclicked); connect(titleBar, &MyTitleBar::signalButtonMaxClicked, this, &DicomImageView::doubleClicked);
connect(titleBar, &MyTitleBar::signalButtonCloseClicked, this, &DicomImageView::Slot_ViewEmpty); connect(titleBar, &MyTitleBar::signalButtonCloseClicked, this, &DicomImageView::viewCleared);
return titleBar; return titleBar;
} }
void DicomImageView::initScrollbar() void DicomImageView::initScrollbar() {
{
//_MinSlice = mImageViewer->GetSliceMin(); //_MinSlice = mImageViewer->GetSliceMin();
//_MaxSlice = mImageViewer->GetSliceMax(); //_MaxSlice = mImageViewer->GetSliceMax();
mScrollBar->setValue(mImageViewer->GetSliceMin()); mScrollBar->setValue(mImageViewer->GetSliceMin());
@@ -96,72 +92,151 @@ void DicomImageView::initScrollbar()
mScrollBar->setVisible(true); mScrollBar->setVisible(true);
} }
//NOTE: not working
void DicomImageView::setHighlight(bool yes) { void DicomImageView::setHighlight(bool yes) {
mTitleBar->SetHighlight(yes); mTitleBar->SetHighlight(yes);
} }
void DicomImageView::SyncScrollBar() {
mScrollBar->SetValueSilently(mImageViewer->GetSlice());
}
void DicomImageView::resetView() {
if (hasSeries()) {
removeViewWithFusion();
removeViewWithMeasure();
mImageViewer->GetRenderer()->RemoveAllViewProps();
this->render();
mImageViewer->Delete();
mImageViewer = nullptr;
//don't delete series It's belong to data cache
mSeries = nullptr;
}
mScrollBar->setVisible(false);
if (mIsCine)
mVcrToolbar->setVisible(false);
}
bool DicomImageView::hasSeries() {
return mSeries;
}
void DicomImageView::loadSeries(SeriesImageSet *series) {
mSeries = series;
mImageViewer->SetInputData(mSeries->GetData());
mImageViewer->InitCornerInfo(series->GetProperty());
mImageViewer->SetupImageViewer();
mImageViewer->UpdateOrientationInfo();
//以下是一些转接函数
//使用connect 替代 AddObserver,避免出现多种事件机制架构
connect(mImageViewer->GetSignalRaiser(), &vtkSignalRaiser::raiseEvent, this, &DicomImageView::syncEventFunc);
//目前 替换了一部分包括SlicedEventEndDollyEventEndWindowLevelEventEndPanEvent主要关联到sync
ActorDraggableInteractorStyle *style = mImageViewer->GetInteractorStyle();
style->AddObserver(ActorDraggableInteractorStyle::AfterViewerClicked, this, &DicomImageView::clicked);
style->AddObserver(vtkCommand::EventIds::WindowLevelEvent, this, &DicomImageView::updateWindowLevelCb);
style->AddObserver(ActorDraggableInteractorStyle::DoubleClickEvent, this, &DicomImageView::doubleclickedEventCb);
style->AddObserver(ActorDraggableInteractorStyle::ScalarOpacityEvent, this, &DicomImageView::scalarEventCb);
style->AddObserver(ActorDraggableInteractorStyle::ScalarShiftEvent, this, &DicomImageView::scalarEventCb);
}
int DicomImageView::getSeriesNumber() {
if (hasSeries()) {
return mSeries->GetSeriesNumber();
}
return -1;
}
void DicomImageView::showMetaData() {
QString fileName = QString::fromLatin1(this->mSeries->getCurImageName());
if (!fileName.isEmpty()) {
DcmFileFormat dcmFile;
if (!dcmFile.loadFile(fileName.toStdString()).good()) {
QMessageBox::warning(this,
tr("Error"),
tr("Unable to read file %1").arg(fileName),
QMessageBox::Ok);
return;
}
metaDataWindow *dicomWindow = new metaDataWindow(&dcmFile);
dicomWindow->setAttribute(Qt::WA_DeleteOnClose);
dicomWindow->setWindowTitle("DICOM Tags (" + fileName + ")");
dicomWindow->setWindowFilePath(fileName);
dicomWindow->resize(USER_CONFIG::DEFAULT_TAG_WINDOW_SIZE);
dicomWindow->show();
}
}
void DicomImageView::resizeEvent(QResizeEvent *event) {
//auto size conner info
if (!mImageViewer) return;
if (mImageViewer->GetvtkCornerAnnotation()) {
mImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size()));
mImageViewer->Render();
}
if (mIsCine) {
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();
mVcrToolbar->move(ax, ay);
}
}
//SLOTS------------------------------------------------------------------------ //SLOTS------------------------------------------------------------------------
void DicomImageView::Slot_scrollValueChanged(int slice) void DicomImageView::scrollBarValueChanged(int slice) {
{
mImageViewer->SetSlice(slice); mImageViewer->SetSlice(slice);
} }
void DicomImageView::Slot_ViewEmpty() void DicomImageView::viewCleared() {
{
emit Signal_ViewEmpty(this); emit Signal_ViewEmpty(this);
} }
void DicomImageView::Slot_viewDoubleclicked() void DicomImageView::doubleClicked() {
{
emit Signal_viewDoubleclicked(this); emit Signal_viewDoubleclicked(this);
} }
void DicomImageView::Slot_WindowLevelEventForFusion(double level, double width) void DicomImageView::fusionWindowChanged(double level, double width) {
{ if (isFusion()) {
if (IsFusion()) {
mImageViewer->SetFusionColorLeveL(level); mImageViewer->SetFusionColorLeveL(level);
mImageViewer->SetFusionColorWindow(width); mImageViewer->SetFusionColorWindow(width);
mImageViewer->Render(); mImageViewer->Render();
} }
} }
void DicomImageView::Slot_Transformation() void DicomImageView::imageTransformed() {
{
mImageViewer->UpdateOrientationInfo(); mImageViewer->UpdateOrientationInfo();
mImageViewer->Render(); mImageViewer->Render();
} }
void DicomImageView::clicked() {
emit Signal_ViewClicked(this);
}
//Widget event---------------------------------------------------------------- //Widget event----------------------------------------------------------------
void DicomImageView::wheelEvent(QWheelEvent *event) void DicomImageView::wheelEvent(QWheelEvent *event) {
{ if (hasSeries()) {
if (HasSeries()) {
int _Slice = mImageViewer->GetSlice(); int _Slice = mImageViewer->GetSlice();
int _MinSlice = mImageViewer->GetSliceMin(); int _MinSlice = mImageViewer->GetSliceMin();
int _MaxSlice = mImageViewer->GetSliceMax(); int _MaxSlice = mImageViewer->GetSliceMax();
if (event->delta() > 0) if (event->delta() > 0) {
{ if (_Slice > _MinSlice) {
if (_Slice > _MinSlice)
{
_Slice -= 1; _Slice -= 1;
mImageViewer->SetSlice(_Slice); mImageViewer->SetSlice(_Slice);
} } else {
else
{
_Slice = _MinSlice; _Slice = _MinSlice;
mImageViewer->SetSlice(_Slice); mImageViewer->SetSlice(_Slice);
} }
} } else {
else if (_Slice < _MaxSlice) {
{
if (_Slice < _MaxSlice)
{
_Slice += 1; _Slice += 1;
mImageViewer->SetSlice(_Slice); mImageViewer->SetSlice(_Slice);
} } else {
else
{
_Slice = _MaxSlice; _Slice = _MaxSlice;
mImageViewer->SetSlice(_Slice); mImageViewer->SetSlice(_Slice);
} }
@@ -169,8 +244,7 @@ void DicomImageView::wheelEvent(QWheelEvent *event)
} }
} }
void DicomImageView::mousePressEvent(QMouseEvent* event) void DicomImageView::mousePressEvent(QMouseEvent *event) {
{
emit Signal_ViewClicked(this); emit Signal_ViewClicked(this);
} }
@@ -191,8 +265,8 @@ void DicomImageView::dragMoveEvent(QDragMoveEvent *e) {
void DicomImageView::dropEvent(QDropEvent *e) { void DicomImageView::dropEvent(QDropEvent *e) {
if (e->mimeData()->hasFormat("text/plain")) { if (e->mimeData()->hasFormat("text/plain")) {
e->acceptProposedAction(); e->acceptProposedAction();
thumbnailImage *tb = qobject_cast<thumbnailImage*>( thumbnailImage *tb = qobject_cast<thumbnailImage *>(
(QObject *)(e->mimeData()->text().toULongLong())); (QObject *) (e->mimeData()->text().toULongLong()));
if (tb) { if (tb) {
emit Signal_DragDropEvent(this, tb); emit Signal_DragDropEvent(this, tb);
} }
@@ -203,41 +277,20 @@ void DicomImageView::dragLeaveEvent(QDragLeaveEvent *) {
return; return;
} }
// layout resize---------------------------------------------------------------
void DicomImageView::resizeEvent(QResizeEvent *event)
{
//auto size conner info
if (!mImageViewer) return;
if (mImageViewer->GetvtkCornerAnnotation()) {
mImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size()));
mImageViewer->Render();
}
if (mIsCine) {
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();
mVcrToolbar->move(ax, ay);
}
}
//Fusion about ------------------------------------------------------------- //Fusion about -------------------------------------------------------------
bool DicomImageView::IsFusion() bool DicomImageView::isFusion() {
{
return mImageViewer->GetFusion(); return mImageViewer->GetFusion();
} }
void DicomImageView::SetFusionInput(DicomImageView *overlay) void DicomImageView::setFusionInput(DicomImageView *overlay) {
{
mOverlayView = overlay; mOverlayView = overlay;
vtkImageData *overlay_data = mOverlayView->getSeriesInstance()->GetData(); vtkImageData *overlay_data = mOverlayView->getSeriesInstance()->GetData();
double window; double window;
double level; double level;
mOverlayView->GetWindowLevel(level, window); mOverlayView->getWindowLevel(level, window);
mImageViewer->FusionOn(); mImageViewer->FusionOn();
mOverlayView->OverlayOn(); mOverlayView->OverlayOn();
@@ -249,7 +302,7 @@ void DicomImageView::SetFusionInput(DicomImageView *overlay)
mImageViewer->SetFusionOpacity(mImageViewer->GetFusionOpacity()); mImageViewer->SetFusionOpacity(mImageViewer->GetFusionOpacity());
// Example for vtkDiscretizableColorTransferFunction // Example for vtkDiscretizableColorTransferFunction
vtkNew< vtkDiscretizableColorTransferFunction> table; vtkNew<vtkDiscretizableColorTransferFunction> table;
// example table1 d->r->g->w // example table1 d->r->g->w
table->AddRGBPoint(0.0, 0.0, 0.0, 0.0); table->AddRGBPoint(0.0, 0.0, 0.0, 0.0);
table->AddRGBPoint(0.33, 1.0, 0.0, 0.0); table->AddRGBPoint(0.33, 1.0, 0.0, 0.0);
@@ -259,8 +312,8 @@ void DicomImageView::SetFusionInput(DicomImageView *overlay)
} }
void DicomImageView::SetFusionOpacity(double percent) { void DicomImageView::setFusionOpacity(double percent) {
if (IsFusion()) { if (isFusion()) {
mImageViewer->IncreFusionOpacity(percent); mImageViewer->IncreFusionOpacity(percent);
mImageViewer->Render(); mImageViewer->Render();
} }
@@ -269,13 +322,11 @@ void DicomImageView::SetFusionOpacity(double percent) {
/** /**
* Remove Fusion no matter it is base or overlay * Remove Fusion no matter it is base or overlay
*/ */
void DicomImageView::removeViewWithFusion() void DicomImageView::removeViewWithFusion() {
{ if (hasSeries()) {
if (HasSeries()) if (isFusion()) {
{
if (IsFusion()) {
disconnect(mOverlayView, &DicomImageView::Signal_WindowLevelEventForFusion, disconnect(mOverlayView, &DicomImageView::Signal_WindowLevelEventForFusion,
this, &DicomImageView::Slot_WindowLevelEventForFusion); this, &DicomImageView::fusionWindowChanged);
this->removeFusion(); this->removeFusion();
mOverlayView->SetBaseView(nullptr); mOverlayView->SetBaseView(nullptr);
@@ -284,7 +335,7 @@ void DicomImageView::removeViewWithFusion()
if (IsOverlay()) { if (IsOverlay()) {
disconnect(this, &DicomImageView::Signal_WindowLevelEventForFusion, disconnect(this, &DicomImageView::Signal_WindowLevelEventForFusion,
mBaseView, &DicomImageView::Slot_WindowLevelEventForFusion); mBaseView, &DicomImageView::fusionWindowChanged);
mBaseView->removeFusion(); mBaseView->removeFusion();
mBaseView->SetOverlayView(nullptr); mBaseView->SetOverlayView(nullptr);
@@ -294,79 +345,49 @@ void DicomImageView::removeViewWithFusion()
} }
} }
void DicomImageView::removeFusion() void DicomImageView::removeFusion() {
{
mImageViewer->RemoveFusionData(); mImageViewer->RemoveFusionData();
mImageViewer->FusionOff(); mImageViewer->FusionOff();
mImageViewer->Render(); mImageViewer->Render();
mOverlayView->OverlayOff(); mOverlayView->OverlayOff();
} }
void DicomImageView::setDicomImageView(SeriesImageSet *series) void DicomImageView::setDicomImageView(SeriesImageSet *series) {
{ if (!mImageViewer) {
if (!mImageViewer){
mImageViewer = infinitiViewer::New(); mImageViewer = infinitiViewer::New();
mImageViewer->SetRenderWindow(mGLRenWin); mImageViewer->SetRenderWindow(mGLRenWin);
mImageViewer->SetupInteractor(mGLRenWin->GetInteractor()); mImageViewer->SetupInteractor(mGLRenWin->GetInteractor());
} }
//series->setVTKOpenGLNativeWidget(this->_glView); //series->setVTKOpenGLNativeWidget(this->_glView);
LoadSeries(series); loadSeries(series);
//whenver change instance,set scroll value to zero //whenver change instance,set scroll value to zero
initScrollbar(); initScrollbar();
if (!mIsSlotInited){ if (!mIsSlotInited) {
connect(mScrollBar, &QScrollBar::valueChanged, this, &DicomImageView::Slot_scrollValueChanged); connect(mScrollBar, &QScrollBar::valueChanged, this, &DicomImageView::scrollBarValueChanged);
connect(this, &DicomImageView::Signal_Transformation, this, &DicomImageView::Slot_Transformation); connect(this, &DicomImageView::Signal_Transformation, this, &DicomImageView::imageTransformed);
mIsSlotInited = true; mIsSlotInited = true;
} }
} }
bool DicomImageView::HasSeries()
{
return mSeries ;
}
void DicomImageView::LoadSeries(SeriesImageSet *series)
{
mSeries = series;
mImageViewer->SetInputData(mSeries->GetData());
mImageViewer->InitCornerInfo(series->GetProperty());
mImageViewer->SetupImageViewer();
mImageViewer->UpdateOrientationInfo();
//以下是一些转接函数
//使用connect 替代 AddObserver,避免出现多种事件机制架构
connect(mImageViewer->GetSignalRaiser(),&vtkSignalRaiser::raiseEvent, this, &DicomImageView::syncEventFunc);
//目前 替换了一部分包括SlicedEventEndDollyEventEndWindowLevelEventEndPanEvent主要关联到sync
ActorDraggableInteractorStyle *style = mImageViewer->GetInteractorStyle();
style->AddObserver(ActorDraggableInteractorStyle::AfterViewerClicked, this, &DicomImageView::viewerClicked);
style->AddObserver(vtkCommand::EventIds::WindowLevelEvent, this, &DicomImageView::updateWindowLevelCb);
style->AddObserver(ActorDraggableInteractorStyle::DoubleClickEvent, this, &DicomImageView::doubleclickedEventCb);
style->AddObserver(ActorDraggableInteractorStyle::ScalarOpacityEvent, this, &DicomImageView::scalarEventCb);
style->AddObserver(ActorDraggableInteractorStyle::ScalarShiftEvent, this, &DicomImageView::scalarEventCb);
}
//Callbacks------------------------------------------------------------------------------------ //Callbacks------------------------------------------------------------------------------------
void DicomImageView::updateWindowLevelCb(vtkObject* caller, unsigned long eid, void *calldata) void DicomImageView::updateWindowLevelCb() {
{
mImageViewer->UpdateCornerInfo(BOTTOM_RIGHT); mImageViewer->UpdateCornerInfo(BOTTOM_RIGHT);
emit Signal_WindowLevelEventForFusion(mImageViewer->GetColorLevel(), mImageViewer->GetColorWindow()); emit Signal_WindowLevelEventForFusion(mImageViewer->GetColorLevel(), mImageViewer->GetColorWindow());
} }
void DicomImageView::scalarEventCb(vtkObject* sender, unsigned long eventId, void* calldata) void DicomImageView::scalarEventCb(vtkObject *, unsigned long eventId, void *calldata) {
{ double *r = (double *) calldata;
double* r = (double*)calldata; switch (eventId) {
switch (eventId) case (ActorDraggableInteractorStyle::ScalarShiftEvent):
{
case(ActorDraggableInteractorStyle::ScalarShiftEvent):
qDebug() << "ScalarShiftEvent"; qDebug() << "ScalarShiftEvent";
mImageViewer->SwitchToNextPreset(); mImageViewer->SwitchToNextPreset();
break; break;
case(ActorDraggableInteractorStyle::ScalarOpacityEvent): case (ActorDraggableInteractorStyle::ScalarOpacityEvent):
qDebug() << "ScalarOpacityEvent" << r[0]; qDebug() << "ScalarOpacityEvent" << r[0];
SetFusionOpacity(r[0]); setFusionOpacity(r[0]);
break; break;
default: default:
@@ -374,28 +395,26 @@ void DicomImageView::scalarEventCb(vtkObject* sender, unsigned long eventId, voi
} }
} }
void DicomImageView::doubleclickedEventCb(vtkObject* sender, unsigned long eventId, void* calldata) { void DicomImageView::doubleclickedEventCb() {
emit Signal_viewDoubleclicked(this); emit Signal_viewDoubleclicked(this);
} }
//TODO重新匹配该函数部分逻辑可以直接保留需要注意Endxxx系列事件不是仅仅为了sync设计的 //TODO重新匹配该函数部分逻辑可以直接保留需要注意Endxxx系列事件不是仅仅为了sync设计的
void DicomImageView::syncEventFunc(vtkObject* caller, unsigned long eid, void *calldata) void DicomImageView::syncEventFunc(vtkObject *, unsigned long eid, void *calldata) {
{
int* r = (int*)calldata; int *r = (int *) calldata;
switch (eid) switch (eid) {
{ case (vtkCommand::EventIds::EndPanEvent):
case(vtkCommand::EventIds::EndPanEvent):
this->Signal_SyncEvent(this, VTKIS_IMAGE_PAN, calldata); this->Signal_SyncEvent(this, VTKIS_IMAGE_PAN, calldata);
break; break;
case(vtkCommand::EventIds::EndWindowLevelEvent): case (vtkCommand::EventIds::EndWindowLevelEvent):
//update corner info through callback //update corner info through callback
this->Signal_SyncEvent(this, VTKIS_IMAGE_WINDOWLEVEL, calldata); this->Signal_SyncEvent(this, VTKIS_IMAGE_WINDOWLEVEL, calldata);
break; break;
case(ActorDraggableInteractorStyle::DraggableStyleEvents::EndDollyEvent): case (ActorDraggableInteractorStyle::DraggableStyleEvents::EndDollyEvent):
this->Signal_SyncEvent(this, VTKIS_IMAGE_ZOOM, calldata); this->Signal_SyncEvent(this, VTKIS_IMAGE_ZOOM, calldata);
break; break;
case(ActorDraggableInteractorStyle::DraggableStyleEvents::SlicedEvent):{ case (ActorDraggableInteractorStyle::DraggableStyleEvents::SlicedEvent): {
mScrollBar->SetValueSilently(r[0]); mScrollBar->SetValueSilently(r[0]);
//invoke event //invoke event
double focusPoint[3] = {.0, .0, .0}; double focusPoint[3] = {.0, .0, .0};
@@ -408,65 +427,9 @@ void DicomImageView::syncEventFunc(vtkObject* caller, unsigned long eid, void *c
} }
} }
void DicomImageView::ResetView() //Image render & operation about--------------------------------------------------------------------------------------
{ void DicomImageView::render() {
if (HasSeries()) if (hasSeries()) {
{
removeViewWithFusion();
removeViewWithMeasure();
mImageViewer->GetRenderer()->RemoveAllViewProps();
this->Render();
mImageViewer->Delete();
mImageViewer = nullptr;
//don't delete series It's belong to data cache
mSeries = nullptr;
}
mScrollBar->setVisible(false);
if (mIsCine)
mVcrToolbar->setVisible(false);
}
int DicomImageView::getSeriesNumber()
{
if (HasSeries())
{
return mSeries->GetSeriesNumber();
}
return -1;
}
void DicomImageView::ShowMetaData()
{
QString fileName = QString::fromLatin1(this->mSeries->getCurImageName());
if (!fileName.isEmpty()) {
DcmFileFormat dcmFile;
if (!dcmFile.loadFile(fileName.toStdString()).good())
{
QMessageBox::warning(this,
tr("Error"),
tr("Unable to read file %1").arg(fileName),
QMessageBox::Ok);
return;
}
metaDataWindow *dicomWindow = new metaDataWindow(&dcmFile);
dicomWindow->setAttribute(Qt::WA_DeleteOnClose);
dicomWindow->setWindowTitle("DICOM Tags ("+fileName+")");
dicomWindow->setWindowFilePath(fileName);
dicomWindow->resize(USER_CONFIG::DEFAULT_TAG_WINDOW_SIZE);
dicomWindow->show();
}
}
//--view about--------------------------------------------------------------------------------------
void DicomImageView::Render()
{
if (HasSeries())
{
if (mImageViewer->GetvtkCornerAnnotation()) { if (mImageViewer->GetvtkCornerAnnotation()) {
mImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size())); mImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size()));
} }
@@ -475,44 +438,49 @@ void DicomImageView::Render()
} }
void DicomImageView::SetSlice(int slice) int DicomImageView::getSliceOrientation() {
{ return mSliceOrientation;
if (mImageViewer == nullptr) }
{
void DicomImageView::getSliceOrientation(int orientation) {
mSliceOrientation = orientation;
mImageViewer->SetSliceOrientation(orientation);
int max = 0;
int min = 0;
mImageViewer->GetSliceRange(min, max);
mScrollBar->setValue(min);
mScrollBar->setMaximum(max);
mScrollBar->setValue(0);
}
void DicomImageView::setSlice(int slice) {
if (mImageViewer == nullptr) {
return; return;
} }
if (HasSeries()) if (hasSeries()) {
{
mImageViewer->SetSlice(slice); mImageViewer->SetSlice(slice);
} }
} }
void DicomImageView::AddSlice(int step) void DicomImageView::addSlice(int step) {
{ if (mImageViewer == nullptr) {
if (mImageViewer == nullptr)
{
return; return;
} }
if (HasSeries()) if (hasSeries()) {
{
int curSlice = mImageViewer->GetSlice() + step; int curSlice = mImageViewer->GetSlice() + step;
mImageViewer->SetSlice(curSlice); mImageViewer->SetSlice(curSlice);
} }
} }
void DicomImageView::SetZoomScale(double scale) void DicomImageView::setZoomScale(double scale) {
{ if (hasSeries()) {
if (HasSeries())
{
mImageViewer->SetZoomScale(scale); mImageViewer->SetZoomScale(scale);
mImageViewer->Render(); mImageViewer->Render();
} }
} }
void DicomImageView::SetPanOffset(double * pan) void DicomImageView::setPanOffset(double *pan) {
{ if (hasSeries()) {
if (HasSeries())
{
mImageViewer->SetPanOffset(pan); mImageViewer->SetPanOffset(pan);
mImageViewer->Render(); mImageViewer->Render();
@@ -520,19 +488,15 @@ void DicomImageView::SetPanOffset(double * pan)
} }
//FIXME:这个函数有问题,会导致MPR显示出错 //FIXME:这个函数有问题,会导致MPR显示出错
void DicomImageView::ResetPanZoom() void DicomImageView::resetPanZoom() {
{ if (hasSeries()) {
if (HasSeries())
{
mImageViewer->ResetZoomScaleToFitWindowSize(); mImageViewer->ResetZoomScaleToFitWindowSize();
} }
} }
void DicomImageView::SetWindowLevel(double level, double width) void DicomImageView::setWindowLevel(double level, double width) {
{ if (hasSeries()) {
if (HasSeries())
{
mImageViewer->SetColorLevel(level); mImageViewer->SetColorLevel(level);
mImageViewer->SetColorWindow(width); mImageViewer->SetColorWindow(width);
@@ -544,25 +508,19 @@ void DicomImageView::SetWindowLevel(double level, double width)
} }
} }
void DicomImageView::GetWindowLevel(double &level, double &width) { void DicomImageView::getWindowLevel(double &level, double &width) {
if (HasSeries()) if (hasSeries()) {
{
level = mImageViewer->GetColorLevel(); level = mImageViewer->GetColorLevel();
width = mImageViewer->GetColorWindow(); width = mImageViewer->GetColorWindow();
} }
} }
void DicomImageView::ToggleNegativeMode() void DicomImageView::negativeWindow() {
{ if (hasSeries()) {
if (HasSeries()) if (mIsNegative) {
{
if (mIsNegative)
{
mImageViewer->SetNegativeMode(false); mImageViewer->SetNegativeMode(false);
mIsNegative = false; mIsNegative = false;
} } else {
else
{
mImageViewer->SetNegativeMode(true); mImageViewer->SetNegativeMode(true);
mIsNegative = true; mIsNegative = true;
} }
@@ -570,9 +528,8 @@ void DicomImageView::ToggleNegativeMode()
} }
} }
void DicomImageView::HFlip() void DicomImageView::hFlipImage() {
{ if (hasSeries()) {
if (HasSeries()) {
int slice = mImageViewer->GetSlice(); int slice = mImageViewer->GetSlice();
//HFlip //HFlip
//mImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0, 1, 0); //mImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0, 1, 0);
@@ -588,9 +545,8 @@ void DicomImageView::HFlip()
} }
} }
void DicomImageView::VFlip() void DicomImageView::vFlipImage() {
{ if (hasSeries()) {
if (HasSeries()) {
//double scale = mImageViewer->GetRenderer()->GetActiveCamera()->GetParallelScale(); //double scale = mImageViewer->GetRenderer()->GetActiveCamera()->GetParallelScale();
int slice = mImageViewer->GetSlice(); int slice = mImageViewer->GetSlice();
@@ -610,9 +566,8 @@ void DicomImageView::VFlip()
} }
void DicomImageView::Rotate(double angle, TransFormType operation) void DicomImageView::rotateImage(double angle, TransFormType operation) {
{ if (hasSeries()) {
if (HasSeries()) {
int slice = mImageViewer->GetSlice(); int slice = mImageViewer->GetSlice();
mImageViewer->GetRenderer()->GetActiveCamera()->Roll(angle); mImageViewer->GetRenderer()->GetActiveCamera()->Roll(angle);
//to avoid black out problem during slicing //to avoid black out problem during slicing
@@ -625,12 +580,10 @@ void DicomImageView::Rotate(double angle, TransFormType operation)
} }
void DicomImageView::ClearTransformations() void DicomImageView::ClearTransformations() {
{ if (hasSeries()) {
if (HasSeries())
{
int slice = mImageViewer->GetSlice(); int slice = mImageViewer->GetSlice();
ResetPanZoom(); resetPanZoom();
double cameraPosition[3]; double cameraPosition[3];
double vup[3]; double vup[3];
@@ -648,37 +601,30 @@ void DicomImageView::ClearTransformations()
} }
} }
void DicomImageView::updateCornerInfoAll() void DicomImageView::updateCornerInfoAll() {
{ if (hasSeries()) {
if (HasSeries())
{
mImageViewer->UpdateCornerInfoAll(); mImageViewer->UpdateCornerInfoAll();
} }
} }
void DicomImageView::updateCornerInfoPrivacy() void DicomImageView::updateCornerInfoPrivacy() {
{ if (hasSeries()) {
if (HasSeries())
{
mImageViewer->UpdateCornerInfo(TOP_RIGHT); mImageViewer->UpdateCornerInfo(TOP_RIGHT);
} }
} }
//--VCR about------------------------------------------------------------------ //--VCR about------------------------------------------------------------------
bool DicomImageView::isVCRVisible() bool DicomImageView::isVCRVisible() {
{
if (!mVcrToolbar) return false; if (!mVcrToolbar) return false;
return mVcrToolbar->isVisible(); return mVcrToolbar->isVisible();
} }
void DicomImageView::setVCRVisible(bool visible) void DicomImageView::setVCRVisible(bool visible) {
{ if (!mVcrToolbar) return;
if (!mVcrToolbar) return ;
mVcrToolbar->setVisible(visible); mVcrToolbar->setVisible(visible);
} }
void DicomImageView::cineModeOn() void DicomImageView::cineModeOn() {
{
if (!mVcrToolbar) return; if (!mVcrToolbar) return;
//updateVCRToolbarPos(); //updateVCRToolbarPos();
int ax = (this->geometry().bottomLeft().x() + this->geometry().bottomRight().x()) / 2 + VCRHelper::getVCRXOffset(); int ax = (this->geometry().bottomLeft().x() + this->geometry().bottomRight().x()) / 2 + VCRHelper::getVCRXOffset();
@@ -691,8 +637,7 @@ void DicomImageView::cineModeOn()
} }
void DicomImageView::initCineModeThread() void DicomImageView::initCineModeThread() {
{
mVcrController = new pqVCRController(nullptr, this); mVcrController = new pqVCRController(nullptr, this);
mVcrController->moveToThread(&mVcrControlThread); mVcrController->moveToThread(&mVcrControlThread);
connect(&mVcrControlThread, &QThread::finished, mVcrController, &QObject::deleteLater); connect(&mVcrControlThread, &QThread::finished, mVcrController, &QObject::deleteLater);
@@ -700,107 +645,69 @@ void DicomImageView::initCineModeThread()
mIsCine = true; mIsCine = true;
} }
void DicomImageView::onFirstFrame() void DicomImageView::onFirstFrame() {
{ if (hasSeries()) {
if (HasSeries()) {
mScrollBar->setValue(mImageViewer->GetSliceMin()); mScrollBar->setValue(mImageViewer->GetSliceMin());
} }
} }
void DicomImageView::onPreviousFrame() void DicomImageView::onPreviousFrame() {
{ if (hasSeries()) {
if (HasSeries()) {
int slice = mImageViewer->GetSlice(); int slice = mImageViewer->GetSlice();
slice = --slice; slice = --slice;
int min_slice = mImageViewer->GetSliceMin(); int min_slice = mImageViewer->GetSliceMin();
if (slice < min_slice) if (slice < min_slice) {
{
slice = mImageViewer->GetSliceMax(); slice = mImageViewer->GetSliceMax();
} }
mScrollBar->setValue(slice); mScrollBar->setValue(slice);
} }
} }
void DicomImageView::onNextFrame() void DicomImageView::onNextFrame() {
{ if (hasSeries()) {
if (HasSeries()) {
int slice = mImageViewer->GetSlice(); int slice = mImageViewer->GetSlice();
slice = ++slice; slice = ++slice;
int max_slice = mImageViewer->GetSliceMax(); int max_slice = mImageViewer->GetSliceMax();
if (slice > max_slice) if (slice > max_slice) {
{
slice = mImageViewer->GetSliceMin(); slice = mImageViewer->GetSliceMin();
} }
mScrollBar->setValue(slice); mScrollBar->setValue(slice);
} }
} }
void DicomImageView::onLastFrame() void DicomImageView::onLastFrame() {
{ if (hasSeries()) {
if (HasSeries()) {
mScrollBar->setValue(mImageViewer->GetSliceMax()); mScrollBar->setValue(mImageViewer->GetSliceMax());
} }
} }
//-- Measure about-------------------------------------------------------------------------------------- //-- Measure about--------------------------------------------------------------------------------------
void DicomImageView::ActiveMeasure(Measure *m) void DicomImageView::activeMeasure(Measure *m) {
{ if (nullptr != mSeries) {
if (nullptr != mSeries)
{
mImageViewer->ActiveMeasure(m); mImageViewer->ActiveMeasure(m);
} }
} }
void DicomImageView::DeleteSelectedMeasure() void DicomImageView::deleteSelectedMeasure() {
{ if (nullptr != mSeries) {
if (nullptr != mSeries)
{
mImageViewer->DeleteSelectedMeasure(); mImageViewer->DeleteSelectedMeasure();
} }
} }
void DicomImageView::DeleteCurrentSliceMeasure() void DicomImageView::deleteCurrentSliceMeasure() {
{ if (nullptr != mSeries) {
if (nullptr != mSeries)
{
mImageViewer->DeleteCurrentSliceMeasure(); mImageViewer->DeleteCurrentSliceMeasure();
} }
} }
void DicomImageView::DeleteCurrentSeriesMeasure() void DicomImageView::deleteCurrentSeriesMeasure() {
{ if (nullptr != mSeries) {
if (nullptr != mSeries)
{
mImageViewer->DeleteCurrentSeriesMeasure(); mImageViewer->DeleteCurrentSeriesMeasure();
} }
} }
void DicomImageView::removeViewWithMeasure() void DicomImageView::removeViewWithMeasure() {
{
mImageViewer->UnActiveMeasure(); mImageViewer->UnActiveMeasure();
mImageViewer->DeleteCurrentSeriesMeasure(); mImageViewer->DeleteCurrentSeriesMeasure();
} }
void DicomImageView::SetSliceOrientation(int orientation) {
mSliceOrientation = orientation;
mImageViewer->SetSliceOrientation(orientation);
int max = 0;
int min = 0;
mImageViewer->GetSliceRange(min, max);
mScrollBar->setValue(min);
mScrollBar->setMaximum(max);
mScrollBar->setValue(0);
}
int DicomImageView::GetSliceOrientation() {
return mSliceOrientation;
}
void DicomImageView::viewerClicked() {
emit Signal_ViewClicked(this);
}
void DicomImageView::SyncScrollBar() {
mScrollBar->SetValueSilently(mImageViewer->GetSlice());
}

View File

@@ -32,7 +32,7 @@ public:
~DicomImageView() override; ~DicomImageView() override;
void ShowMetaData(); void showMetaData();
QVTKOpenGLNativeWidget *getGLWidget() { QVTKOpenGLNativeWidget *getGLWidget() {
return mGLWidget; return mGLWidget;
@@ -44,12 +44,12 @@ public:
void setHighlight(bool yes); void setHighlight(bool yes);
void Render(); void render();
//Series //Series
void setDicomImageView(SeriesImageSet *series); void setDicomImageView(SeriesImageSet *series);
bool HasSeries(); bool hasSeries();
int getSeriesNumber(); int getSeriesNumber();
@@ -58,7 +58,7 @@ public:
} }
//Reset //Reset
void ResetView(); void resetView();
//Corner Info //Corner Info
@@ -67,50 +67,50 @@ 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();
void HFlip(); void hFlipImage();
void VFlip(); void vFlipImage();
void Rotate(double angle, TransFormType operation); void rotateImage(double angle, TransFormType operation);
//Fusion //Fusion
bool IsFusion(); bool isFusion();
void SetFusionOpacity(double percent); void setFusionOpacity(double percent);
void SetFusionInput(DicomImageView *overlap); void setFusionInput(DicomImageView *overlay);
void removeViewWithFusion(); void removeViewWithFusion();
//Measure //Measure
void ActiveMeasure(Measure *m); void activeMeasure(Measure *m);
void DeleteSelectedMeasure(); void deleteSelectedMeasure();
void DeleteCurrentSliceMeasure(); void deleteCurrentSliceMeasure();
void DeleteCurrentSeriesMeasure(); void deleteCurrentSeriesMeasure();
void removeViewWithMeasure(); void removeViewWithMeasure();
//Sync slice //Sync slice
void AddSlice(int step); void addSlice(int step);
void SetSlice(int slice); void setSlice(int slice);
void SetZoomScale(double scale); void setZoomScale(double scale);
void SetPanOffset(double *p); void setPanOffset(double *p);
void SyncScrollBar(); void SyncScrollBar();
@@ -144,11 +144,11 @@ public:
} }
//Negative //Negative
void ToggleNegativeMode(); void negativeWindow();
void SetSliceOrientation(int orientation); void getSliceOrientation(int orientation);
int GetSliceOrientation(); int getSliceOrientation();
bool CompareWorldSliceOrientation(DicomImageView *view) { bool CompareWorldSliceOrientation(DicomImageView *view) {
return this->mImageViewer->GetWorldSliceOrientation() == view->mImageViewer->GetWorldSliceOrientation(); return this->mImageViewer->GetWorldSliceOrientation() == view->mImageViewer->GetWorldSliceOrientation();
@@ -177,17 +177,17 @@ signals:
public slots: public slots:
//for title bar use //for title bar use
void Slot_viewDoubleclicked(); void doubleClicked();
void Slot_ViewEmpty(); void viewCleared();
void Slot_scrollValueChanged(int); void scrollBarValueChanged(int);
void Slot_WindowLevelEventForFusion(double level, double width); void fusionWindowChanged(double level, double width);
void Slot_Transformation(); void imageTransformed();
void viewerClicked(); void clicked();
protected: protected:
/** /**
@@ -255,11 +255,11 @@ private:
//Callback //Callback
void doubleclickedEventCb(vtkObject *sender, unsigned long eventId, void *calldata = nullptr); void doubleclickedEventCb();
void scalarEventCb(vtkObject *sender, unsigned long eventId, void *calldata = nullptr); void scalarEventCb(vtkObject *sender, unsigned long eventId, void *calldata = nullptr);
void updateWindowLevelCb(vtkObject *caller, unsigned long eid, void *calldata); void updateWindowLevelCb();
void syncEventFunc(vtkObject *caller, unsigned long eid, void *calldata); void syncEventFunc(vtkObject *caller, unsigned long eid, void *calldata);
@@ -272,31 +272,31 @@ private:
*/ */
MyTitleBar *createMyTitleBar(); MyTitleBar *createMyTitleBar();
void ResetPanZoom(); void resetPanZoom();
void initScrollbar(); void initScrollbar();
void LoadSeries(SeriesImageSet *series); void loadSeries(SeriesImageSet *series);
vtkSmartPointer<vtkGenericOpenGLRenderWindow> mGLRenWin; vtkSmartPointer<vtkGenericOpenGLRenderWindow> mGLRenWin;
infinitiViewer *mImageViewer = nullptr; infinitiViewer *mImageViewer;
SeriesImageSet *mSeries = nullptr; SeriesImageSet *mSeries;
ClickableScrollBar *mScrollBar = nullptr; ClickableScrollBar *mScrollBar;
MyTitleBar *mTitleBar = nullptr; MyTitleBar *mTitleBar;
QVTKOpenGLNativeWidget *mGLWidget = nullptr; QVTKOpenGLNativeWidget *mGLWidget;
pqVCRToolbar *mVcrToolbar = nullptr; pqVCRToolbar *mVcrToolbar ;
pqVCRController *mVcrController = nullptr; pqVCRController *mVcrController;
QThread mVcrControlThread; QThread mVcrControlThread;
DicomImageView *mOverlayView = nullptr; DicomImageView *mOverlayView;
DicomImageView *mBaseView = nullptr; DicomImageView *mBaseView;
int mSliceOrientation = 2; int mSliceOrientation;
bool mIsCine = false; bool mIsCine;
bool mIsNegative = false; bool mIsNegative;
bool mIsOverlay = false; bool mIsOverlay;
bool mIsSlotInited = false; bool mIsSlotInited;
}; };
#endif #endif

View File

@@ -173,7 +173,7 @@ void ThumbnailBarWidget::Slot_setCurrentThumbnail(DicomImageView *view)
{ {
if (view != nullptr) if (view != nullptr)
{ {
if (view->HasSeries()) { if (view->hasSeries()) {
SeriesImageSet *series = view->getSeriesInstance(); SeriesImageSet *series = view->getSeriesInstance();
auto iter = std::find_if(LabelList.begin(),LabelList.end(),[=](QWidget* widget){ auto iter = std::find_if(LabelList.begin(),LabelList.end(),[=](QWidget* widget){
if(0 == strcmp(widget->metaObject()->className(),"thumbnailImage")){ if(0 == strcmp(widget->metaObject()->className(),"thumbnailImage")){

View File

@@ -70,7 +70,7 @@ void ViewContainerWidget::Slot_SyncEvent(DicomImageView *view, int interactionMo
if (SyncHelper::getSyncState() == AUTO_SYNC) if (SyncHelper::getSyncState() == AUTO_SYNC)
{ {
manager.smartDo([](auto v,auto callData){ manager.smartDo([](auto v,auto callData){
if (v->HasSeries()) { if (v->hasSeries()) {
double* r = (double*) callData; double* r = (double*) callData;
v->SyncSlicePoint(r); v->SyncSlicePoint(r);
v->SyncScrollBar(); v->SyncScrollBar();
@@ -80,10 +80,10 @@ void ViewContainerWidget::Slot_SyncEvent(DicomImageView *view, int interactionMo
if (SyncHelper::getSyncState() == MANUAL_SYNC) if (SyncHelper::getSyncState() == MANUAL_SYNC)
{ {
manager.smartDo([](auto v,auto callData){ manager.smartDo([](auto v,auto callData){
if (v->HasSeries()) { if (v->hasSeries()) {
//disable global trigger slot //disable global trigger slot
int *r = (int *) callData; int *r = (int *) callData;
v->AddSlice(r[1]); v->addSlice(r[1]);
} }
},view, calldata,ImageViewManager::EStudyEBoundsSeries); },view, calldata,ImageViewManager::EStudyEBoundsSeries);
} }
@@ -94,10 +94,10 @@ void ViewContainerWidget::Slot_SyncEvent(DicomImageView *view, int interactionMo
if (SyncHelper::getSyncItem(ZOOM_PAN)) if (SyncHelper::getSyncItem(ZOOM_PAN))
{ {
manager.smartDo([](auto v,auto callData){ manager.smartDo([](auto v,auto callData){
if (v->HasSeries()) { if (v->hasSeries()) {
double *d = (double *)callData; double *d = (double *)callData;
double vector[3] = { d[3] - d[0],d[4] - d[1],d[5] - d[2] }; double vector[3] = { d[3] - d[0],d[4] - d[1],d[5] - d[2] };
v->SetPanOffset(vector); v->setPanOffset(vector);
} }
},view, calldata,ImageViewManager::EStudyEBoundsSeries); },view, calldata,ImageViewManager::EStudyEBoundsSeries);
} }
@@ -106,9 +106,9 @@ void ViewContainerWidget::Slot_SyncEvent(DicomImageView *view, int interactionMo
if (SyncHelper::getSyncItem(ZOOM_PAN)) if (SyncHelper::getSyncItem(ZOOM_PAN))
{ {
manager.smartDo([](auto v,auto callData){ manager.smartDo([](auto v,auto callData){
if (v->HasSeries()) { if (v->hasSeries()) {
double *d = (double *)callData; double *d = (double *)callData;
v->SetZoomScale(d[1]); v->setZoomScale(d[1]);
} }
},view, calldata,ImageViewManager::EStudyEBoundsSeries); },view, calldata,ImageViewManager::EStudyEBoundsSeries);
} }
@@ -117,9 +117,9 @@ void ViewContainerWidget::Slot_SyncEvent(DicomImageView *view, int interactionMo
if (SyncHelper::getSyncItem(WIDTH_LEVEL)) if (SyncHelper::getSyncItem(WIDTH_LEVEL))
{ {
manager.smartDo([](auto v,auto callData){ manager.smartDo([](auto v,auto callData){
if (v->HasSeries()) { if (v->hasSeries()) {
double *d = (double *)callData; double *d = (double *)callData;
v->SetWindowLevel(d[1], d[0]); v->setWindowLevel(d[1], d[0]);
} }
},view, calldata,ImageViewManager::EStudyEBoundsSeries); },view, calldata,ImageViewManager::EStudyEBoundsSeries);
} }
@@ -287,7 +287,7 @@ void ViewContainerWidget::Slot_ViewEmpty(DicomImageView *view)
{ {
if (view != nullptr) if (view != nullptr)
{ {
view->ResetView(); view->resetView();
} }
} }
@@ -330,7 +330,7 @@ void ViewContainerWidget::replaceViewWithSerie(const std::string& uniqueid, Dico
curV->removeViewWithFusion(); curV->removeViewWithFusion();
DicomLoader *helper = DicomLoader::GetInstance(); DicomLoader *helper = DicomLoader::GetInstance();
curV->setDicomImageView(helper->getSeriesImageSet(uniqueid)); curV->setDicomImageView(helper->getSeriesImageSet(uniqueid));
curV->Render(); curV->render();
} }
void ViewContainerWidget::toggleViewWithFusion() void ViewContainerWidget::toggleViewWithFusion()
@@ -338,7 +338,7 @@ void ViewContainerWidget::toggleViewWithFusion()
if (manager.getCurrentView()) if (manager.getCurrentView())
{ {
if (manager.getCurrentView()->HasSeries() && manager.getCurrentView()->IsFusion()) if (manager.getCurrentView()->hasSeries() && manager.getCurrentView()->isFusion())
{ {
removeCurrentViewWithFusion(); removeCurrentViewWithFusion();
} }
@@ -358,10 +358,10 @@ void ViewContainerWidget::replaceViewWithFusion()
if (checkFusionStatus(manager.getCurrentView(), overlap_view)) if (checkFusionStatus(manager.getCurrentView(), overlap_view))
{ {
connect(overlap_view, &DicomImageView::Signal_WindowLevelEventForFusion, connect(overlap_view, &DicomImageView::Signal_WindowLevelEventForFusion,
manager.getCurrentView(), &DicomImageView::Slot_WindowLevelEventForFusion); manager.getCurrentView(), &DicomImageView::fusionWindowChanged);
manager.getCurrentView()->SetFusionInput(overlap_view); manager.getCurrentView()->setFusionInput(overlap_view);
manager.getCurrentView()->Render(); manager.getCurrentView()->render();
return; return;
} }
} }
@@ -380,7 +380,7 @@ bool ViewContainerWidget::checkFusionStatus(DicomImageView *base, DicomImageView
SeriesImageSet* baseSeries = base->getSeriesInstance(); SeriesImageSet* baseSeries = base->getSeriesInstance();
SeriesImageSet* overlapSeries = overlap->getSeriesInstance(); SeriesImageSet* overlapSeries = overlap->getSeriesInstance();
// no data // no data
if (!base->HasSeries() || !overlap->HasSeries()) return false; if (!base->hasSeries() || !overlap->hasSeries()) return false;
// diff study // diff study
if (baseSeries->getStudyUID() == nullptr || if (baseSeries->getStudyUID() == nullptr ||
strcmp(baseSeries->getStudyUID(), overlapSeries->getStudyUID())!=0) return false; strcmp(baseSeries->getStudyUID(), overlapSeries->getStudyUID())!=0) return false;
@@ -391,7 +391,7 @@ bool ViewContainerWidget::checkFusionStatus(DicomImageView *base, DicomImageView
void ViewContainerWidget::updateCornerInfoAll() { void ViewContainerWidget::updateCornerInfoAll() {
manager.smartDo([](auto v, auto calldata) { manager.smartDo([](auto v, auto calldata) {
if (v->HasSeries()){ if (v->hasSeries()){
v->updateCornerInfoAll(); v->updateCornerInfoAll();
} }
}, nullptr, nullptr, ImageViewManager::All); }, nullptr, nullptr, ImageViewManager::All);
@@ -399,7 +399,7 @@ void ViewContainerWidget::updateCornerInfoAll() {
void ViewContainerWidget::updateCornerInfoPrivacy() { void ViewContainerWidget::updateCornerInfoPrivacy() {
manager.smartDo([](auto v, auto calldata) { manager.smartDo([](auto v, auto calldata) {
if (v->HasSeries()){ if (v->hasSeries()){
v->updateCornerInfoPrivacy(); v->updateCornerInfoPrivacy();
} }
}, nullptr, nullptr, ImageViewManager::All); }, nullptr, nullptr, ImageViewManager::All);
@@ -407,8 +407,8 @@ void ViewContainerWidget::updateCornerInfoPrivacy() {
void ViewContainerWidget::render() { void ViewContainerWidget::render() {
manager.smartDo([](auto v, auto calldata) { manager.smartDo([](auto v, auto calldata) {
if (v->HasSeries()){ if (v->hasSeries()){
v->Render(); v->render();
} }
}, nullptr, nullptr, ImageViewManager::All); }, nullptr, nullptr, ImageViewManager::All);
} }
@@ -416,18 +416,18 @@ void ViewContainerWidget::render() {
void ViewContainerWidget::activeMeasure() { void ViewContainerWidget::activeMeasure() {
manager.smartDo([](auto v, auto calldata) { manager.smartDo([](auto v, auto calldata) {
if (v->HasSeries()){ if (v->hasSeries()){
Measure* measure = MeasureFactory::getMeasure((AnnotationActorType)MeasureHelper::getMeasureType()); Measure* measure = MeasureFactory::getMeasure((AnnotationActorType)MeasureHelper::getMeasureType());
v->ActiveMeasure(measure); v->activeMeasure(measure);
} }
}, nullptr, nullptr, ImageViewManager::All); }, nullptr, nullptr, ImageViewManager::All);
} }
void ViewContainerWidget::SetCurrentViewSliceOrientation(int type) { void ViewContainerWidget::SetCurrentViewSliceOrientation(int type) {
manager.getCurrentView()->SetSliceOrientation(type); manager.getCurrentView()->getSliceOrientation(type);
} }
int ViewContainerWidget::GetCurrentViewSliceOrientation() { int ViewContainerWidget::GetCurrentViewSliceOrientation() {
return manager.getCurrentView()->GetSliceOrientation();; return manager.getCurrentView()->getSliceOrientation();;
} }

View File

@@ -300,9 +300,9 @@ void QDicomViewer::SetupAnnoTool(QToolButton* annoBtn)
m->addAction(tr("Show Dicom tags"), this, [&] { m->addAction(tr("Show Dicom tags"), this, [&] {
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV->HasSeries()) if (curV->hasSeries())
{ {
curV->ShowMetaData(); curV->showMetaData();
} }
}); });
@@ -327,19 +327,19 @@ void QDicomViewer::executeActiveMeasure()
case AnnotationActorType::DeleteSelectedAnn: case AnnotationActorType::DeleteSelectedAnn:
if (curV != nullptr) if (curV != nullptr)
{ {
curV->DeleteSelectedMeasure(); curV->deleteSelectedMeasure();
} }
break; break;
case AnnotationActorType::DeleteSliceAnn: case AnnotationActorType::DeleteSliceAnn:
if (curV != nullptr) if (curV != nullptr)
{ {
curV->DeleteCurrentSliceMeasure(); curV->deleteCurrentSliceMeasure();
} }
break; break;
case AnnotationActorType::DeleteSeriesAnn: case AnnotationActorType::DeleteSeriesAnn:
if (curV != nullptr) if (curV != nullptr)
{ {
curV->DeleteCurrentSeriesMeasure(); curV->deleteCurrentSeriesMeasure();
} }
break; break;
default: default:
@@ -422,7 +422,7 @@ void QDicomViewer::SetupMeasureTool(QToolButton* measureBtn)
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV != nullptr) if (curV != nullptr)
{ {
curV->DeleteSelectedMeasure(); curV->deleteSelectedMeasure();
} }
}); });
m->addAction(tr("Delete all in current slice"), this, [=] { m->addAction(tr("Delete all in current slice"), this, [=] {
@@ -431,7 +431,7 @@ void QDicomViewer::SetupMeasureTool(QToolButton* measureBtn)
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV != nullptr) if (curV != nullptr)
{ {
curV->DeleteCurrentSliceMeasure(); curV->deleteCurrentSliceMeasure();
} }
}); });
m->addAction(tr("Delete all in current series"), this, [=] { m->addAction(tr("Delete all in current series"), this, [=] {
@@ -441,7 +441,7 @@ void QDicomViewer::SetupMeasureTool(QToolButton* measureBtn)
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV != nullptr) if (curV != nullptr)
{ {
curV->DeleteCurrentSeriesMeasure(); curV->deleteCurrentSeriesMeasure();
} }
}); });
@@ -468,7 +468,7 @@ void QDicomViewer::SetupCineTool(QToolButton* cineBtn)
cineBtn->setToolTip(QString("Cine")); cineBtn->setToolTip(QString("Cine"));
connect(cineBtn, &QToolButton::clicked, this, [&] { connect(cineBtn, &QToolButton::clicked, this, [&] {
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV->HasSeries()) if (curV->hasSeries())
{ {
if (curV->IsCine()) if (curV->IsCine())
{ {
@@ -563,9 +563,9 @@ void QDicomViewer::SetupAdjustTool(QToolButton* winlevelBtn)
m->addAction(tr("Negative"), this, [=](bool value) { m->addAction(tr("Negative"), this, [=](bool value) {
winlevelBtn->setChecked(true); winlevelBtn->setChecked(true);
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV != nullptr && curV->HasSeries()) if (curV != nullptr && curV->hasSeries())
{ {
curV->ToggleNegativeMode(); curV->negativeWindow();
} }
}); });
@@ -591,47 +591,47 @@ void QDicomViewer::SetupFlipTool(QToolButton* flipBtn)
m = new QMenu(this); m = new QMenu(this);
m->addAction(tr("Rotate 90 CCW"), this, [&] { m->addAction(tr("Rotate 90 CCW"), this, [&] {
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV != nullptr && curV->HasSeries()) if (curV != nullptr && curV->hasSeries())
{ {
curV->Rotate(90, ROTATE_90_CCW); curV->rotateImage(90, ROTATE_90_CCW);
} }
}); });
m->addAction(tr("Rotate 90 CW"), this, [&] { m->addAction(tr("Rotate 90 CW"), this, [&] {
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV != nullptr && curV->HasSeries()) if (curV != nullptr && curV->hasSeries())
{ {
curV->Rotate(-90, ROTATE_90_CW); curV->rotateImage(-90, ROTATE_90_CW);
} }
}); });
m->addAction(tr("Rotate 180"), this, [&] { m->addAction(tr("Rotate 180"), this, [&] {
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV != nullptr && curV->HasSeries()) if (curV != nullptr && curV->hasSeries())
{ {
curV->Rotate(180, ROTATE_180); curV->rotateImage(180, ROTATE_180);
} }
}); });
m->addSeparator(); m->addSeparator();
m->addAction(tr("Flip horizontal"), this, [&] { m->addAction(tr("Flip horizontal"), this, [&] {
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV != nullptr && curV->HasSeries()) if (curV != nullptr && curV->hasSeries())
{ {
curV->HFlip(); curV->hFlipImage();
} }
}); });
m->addAction(tr("Flip vertical"), this, [&] { m->addAction(tr("Flip vertical"), this, [&] {
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV != nullptr && curV->HasSeries()) if (curV != nullptr && curV->hasSeries())
{ {
curV->VFlip(); curV->vFlipImage();
} }
}); });
m->addSeparator(); m->addSeparator();
m->addAction(tr("Clear transformations"), this, [&] { m->addAction(tr("Clear transformations"), this, [&] {
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV != nullptr && curV->HasSeries()) if (curV != nullptr && curV->hasSeries())
{ {
curV->ClearTransformations(); curV->ClearTransformations();
} }
@@ -641,9 +641,9 @@ void QDicomViewer::SetupFlipTool(QToolButton* flipBtn)
connect(flipBtn, &QPushButton::clicked, this, [&] { connect(flipBtn, &QPushButton::clicked, this, [&] {
DicomImageView* curV = ui->viewContainer->getCurrentView(); DicomImageView* curV = ui->viewContainer->getCurrentView();
if (curV != nullptr && curV->HasSeries()) if (curV != nullptr && curV->hasSeries())
{ {
curV->Rotate(90, ROTATE_90_CCW); curV->rotateImage(90, ROTATE_90_CCW);
} }
}); });
} }

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();
} }