Refactor dicomimageview. 2
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
//目前 替换了一部分包括SlicedEvent,EndDollyEvent,EndWindowLevelEvent,EndPanEvent,主要关联到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);
|
|
||||||
//目前 替换了一部分包括SlicedEvent,EndDollyEvent,EndWindowLevelEvent,EndPanEvent,主要关联到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());
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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")){
|
||||||
|
|||||||
@@ -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();;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user