Measurement suit for MPR mode.
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
#include "QDicomViewer.h"
|
#include "QDicomViewer.h"
|
||||||
#include "global/include_all.h"
|
#include "global/include_all.h"
|
||||||
#include "base/SeriesImageSet.h"
|
#include "base/SeriesImageSet.h"
|
||||||
#include "view/subview/gridpopwidget.h"
|
#include "view/subview/gridpopwidget.h"
|
||||||
@@ -11,18 +11,11 @@
|
|||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QButtonGroup>
|
#include <QButtonGroup>
|
||||||
#include <QRect>
|
#include <QRect>
|
||||||
#include "measure/ControlPointActor.h"
|
|
||||||
#include "measure/RulerAnnotationActor.h"
|
|
||||||
#include "measure/AngleAnnotationActor.h"
|
|
||||||
#include "measure/TextAnnotationActor.h"
|
|
||||||
#include "measure/EllipseAnnotationActor.h"
|
|
||||||
#include "measure/OpenPolyAnnotationActor.h"
|
|
||||||
#include "measure/ArrowAnnotationActor.h"
|
|
||||||
#include "measure/pqFontPropertyWidget.h"
|
|
||||||
#include "cine/pqVCRToolbar.h"
|
#include "cine/pqVCRToolbar.h"
|
||||||
|
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include "measure/ActorDraggableInteractorStyle.h""
|
#include "measure/ActorDraggableInteractorStyle.h"
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Consider:
|
* Consider:
|
||||||
@@ -331,11 +324,11 @@ void QDicomViewer::SetupAnnoTool(QToolButton* annoBtn)
|
|||||||
|
|
||||||
|
|
||||||
//AnnotationActor执行相关
|
//AnnotationActor执行相关
|
||||||
//TODO:考虑从这个类中移除,采用factory模式解耦合
|
void QDicomViewer::executeActiveMeasure()
|
||||||
void QDicomViewer::executeActiveMeasure(ViewContainerWidget* Container, AnnotationActorType annType)
|
|
||||||
{
|
{
|
||||||
|
ui->viewContainer->activeMeasure();
|
||||||
DicomImageView* curV = ui->viewContainer->getCurrentView();
|
DicomImageView* curV = ui->viewContainer->getCurrentView();
|
||||||
switch (annType)
|
switch (MeasureHelper::getMeasureType())
|
||||||
{
|
{
|
||||||
case AnnotationActorType::DeleteSelectedAnn:
|
case AnnotationActorType::DeleteSelectedAnn:
|
||||||
if (curV != nullptr)
|
if (curV != nullptr)
|
||||||
@@ -367,7 +360,7 @@ void QDicomViewer::SetupMeasureTool(QToolButton* measureBtn)
|
|||||||
measureBtn->setToolTip(QString("Measurements"));
|
measureBtn->setToolTip(QString("Measurements"));
|
||||||
|
|
||||||
connect(measureBtn, &QToolButton::clicked, this, [=] {
|
connect(measureBtn, &QToolButton::clicked, this, [=] {
|
||||||
executeActiveMeasure(ui->viewContainer, m_cur_measure);
|
executeActiveMeasure();
|
||||||
});
|
});
|
||||||
|
|
||||||
QMenu* m;
|
QMenu* m;
|
||||||
|
|||||||
@@ -91,10 +91,8 @@ private:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 按照annType的类型,在Container中执行对应的Measurement操作
|
* 按照annType的类型,在Container中执行对应的Measurement操作
|
||||||
* @param Container 包含RenderWindow的QTWidget容器
|
|
||||||
* @param annType 需要执行操作的AnnotationActorType
|
|
||||||
*/
|
*/
|
||||||
void executeActiveMeasure(ViewContainerWidget *Container, AnnotationActorType annType);
|
void executeActiveMeasure();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 为对应的DicomImageView构建对应的播放控件
|
* 为对应的DicomImageView构建对应的播放控件
|
||||||
|
|||||||
@@ -866,7 +866,8 @@ void infinitiViewer::LoadMeasures(bool forceReload) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void infinitiViewer::ReloadCurrentSliceMeasure() {
|
void infinitiViewer::ReloadCurrentSliceMeasure() {
|
||||||
list = measureStore->GetMeasures(SOP_UID, ImageMapper->GetSliceNumber());
|
list = measureStore->GetMeasures(SOP_UID, this->SliceOrientation, ImageMapper->GetSliceNumber());
|
||||||
|
|
||||||
if (list)
|
if (list)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < list->length(); i++) {
|
for (int i = 0; i < list->length(); i++) {
|
||||||
@@ -891,7 +892,7 @@ void infinitiViewer::ClearCurrentSliceMeasure() const {
|
|||||||
void infinitiViewer::AddMeasures(vtkObject*, unsigned long eventid, void* calldata) {
|
void infinitiViewer::AddMeasures(vtkObject*, unsigned long eventid, void* calldata) {
|
||||||
auto m = static_cast<Measure*>(calldata);
|
auto m = static_cast<Measure*>(calldata);
|
||||||
if (m->Valid()) {
|
if (m->Valid()) {
|
||||||
measureStore->Store(SOP_UID, this->ImageMapper->GetSliceNumber(), m);
|
measureStore->Store(SOP_UID, this->SliceOrientation,this->ImageMapper->GetSliceNumber(), m);
|
||||||
}
|
}
|
||||||
LoadMeasures(true);
|
LoadMeasures(true);
|
||||||
this->Render();
|
this->Render();
|
||||||
@@ -918,7 +919,7 @@ void infinitiViewer::DeleteSelectedMeasure() {
|
|||||||
void infinitiViewer::DeleteCurrentSliceMeasure() {
|
void infinitiViewer::DeleteCurrentSliceMeasure() {
|
||||||
this->InteractorStyle->ClearSelectedProp();
|
this->InteractorStyle->ClearSelectedProp();
|
||||||
ClearCurrentSliceMeasure();
|
ClearCurrentSliceMeasure();
|
||||||
measureStore->RemoveAllInSlice(SOP_UID, this->ImageMapper->GetSliceNumber());
|
measureStore->RemoveAllInSlice(SOP_UID, this->SliceOrientation, this->ImageMapper->GetSliceNumber());
|
||||||
ReloadCurrentSliceMeasure();
|
ReloadCurrentSliceMeasure();
|
||||||
this->Render();
|
this->Render();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,37 +4,49 @@
|
|||||||
|
|
||||||
#include "MeasureStore.h"
|
#include "MeasureStore.h"
|
||||||
#include "Measure.h"
|
#include "Measure.h"
|
||||||
|
#include "qdebug.h"
|
||||||
|
#include <algorithm>
|
||||||
MeasureStore* MeasureStore::instance = nullptr;
|
MeasureStore* MeasureStore::instance = nullptr;
|
||||||
|
|
||||||
void MeasureStore::Store(QString SeriesUid, int slice, Measure *measure) {
|
void MeasureStore::Store(QString SeriesUid, int plane, int slice, Measure *measure) {
|
||||||
if (!store.contains(SeriesUid)){
|
if (!store.contains(SeriesUid)){
|
||||||
store[SeriesUid]=QMap<int,QList<Measure*>>();
|
store[SeriesUid]=QMap<int, QMap<int,QList<Measure*>>>();
|
||||||
}
|
}
|
||||||
if (!store[SeriesUid].contains(slice)){
|
if (!store[SeriesUid].contains(plane)){
|
||||||
store[SeriesUid][slice] = QList<Measure*>();
|
store[SeriesUid][plane] = QMap<int,QList<Measure*>>();
|
||||||
}
|
}
|
||||||
if(store[SeriesUid][slice].contains(measure)) return;
|
if (!store[SeriesUid][plane].contains(slice)){
|
||||||
measure->SetMeasureID(QString("%1-%2").arg(SeriesUid).arg(slice));
|
store[SeriesUid][plane][slice] = QList<Measure*>();
|
||||||
store[SeriesUid][slice].push_back(measure);
|
}
|
||||||
|
measure->SetMeasureID(QString("%1-%2-%3-%4").arg(SeriesUid).arg(plane).arg(slice).arg(store[SeriesUid][plane][slice].size()));
|
||||||
|
qDebug()<<"store MeasureID:"<<measure->GetMeasureID();
|
||||||
|
store[SeriesUid][plane][slice].push_back(measure);
|
||||||
|
qDebug()<<"measure count:"<<store[SeriesUid][plane][slice].size();
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<Measure *>* MeasureStore::GetMeasures(QString SeriesUid, int slice) {
|
QList<Measure *>* MeasureStore::GetMeasures(QString SeriesUid, int plane, int slice) {
|
||||||
if (!store.contains(SeriesUid)) return nullptr;
|
|
||||||
if (!store[SeriesUid].contains(slice))return nullptr;
|
qDebug()<<"measure SeriesUid:"<<SeriesUid<<", plane:"<<plane<<", slice:"<<slice;
|
||||||
return &store[SeriesUid][slice];
|
if (!store.contains(SeriesUid))
|
||||||
|
return nullptr;
|
||||||
|
if (!store[SeriesUid].contains(plane))
|
||||||
|
return nullptr;
|
||||||
|
if (!store[SeriesUid][plane].contains(slice))
|
||||||
|
return nullptr;
|
||||||
|
qDebug()<<"measure count:"<<store[SeriesUid][plane][slice].size();
|
||||||
|
return &store[SeriesUid][plane][slice];
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeasureStore::Remove(Measure *measure) {
|
void MeasureStore::Remove(Measure *measure) {
|
||||||
QString id = measure->GetMeasureID();
|
QString id = measure->GetMeasureID();
|
||||||
QStringList list = id.split("-");
|
QStringList list = id.split("-");
|
||||||
measure->ForceDelete();
|
measure->ForceDelete();
|
||||||
store[list[0]][list[1].toInt()].removeOne(measure);
|
store[list[0]][list[1].toInt()][list[2].toInt()].removeOne(measure);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeasureStore::RemoveAllInSlice(QString SeriesUid,int slice) {
|
void MeasureStore::RemoveAllInSlice(QString SeriesUid, int plane, int slice) {
|
||||||
for (auto item:store[SeriesUid][slice]) {
|
for (auto item:store[SeriesUid][plane][slice]) {
|
||||||
item->ForceDelete();
|
item->ForceDelete();
|
||||||
}
|
}
|
||||||
store[SeriesUid][slice].clear();
|
store[SeriesUid][slice].clear();
|
||||||
@@ -42,9 +54,11 @@ void MeasureStore::RemoveAllInSlice(QString SeriesUid,int slice) {
|
|||||||
|
|
||||||
void MeasureStore::RemoveAllInSeries(QString SeriesUid) {
|
void MeasureStore::RemoveAllInSeries(QString SeriesUid) {
|
||||||
for (auto series:store[SeriesUid]) {
|
for (auto series:store[SeriesUid]) {
|
||||||
for (auto item: series)
|
for (auto plane :series) {
|
||||||
{
|
for (auto item: plane) {
|
||||||
item->ForceDelete();
|
item->ForceDelete();
|
||||||
|
}
|
||||||
|
plane.clear();
|
||||||
}
|
}
|
||||||
series.clear();
|
series.clear();
|
||||||
}
|
}
|
||||||
@@ -54,16 +68,16 @@ void MeasureStore::RemoveAllInSeries(QString SeriesUid) {
|
|||||||
void MeasureStore::Clear() {
|
void MeasureStore::Clear() {
|
||||||
for(auto item: store)
|
for(auto item: store)
|
||||||
{
|
{
|
||||||
for (auto list :item)
|
for (auto plane :item) {
|
||||||
{
|
for (auto list :plane) {
|
||||||
for (auto m : list)
|
for (auto m : list) {
|
||||||
{
|
if (m) {
|
||||||
if (m){
|
m->ForceDelete();
|
||||||
m->ForceDelete();
|
m = nullptr;
|
||||||
m=nullptr;
|
}
|
||||||
}
|
}
|
||||||
|
list.clear();
|
||||||
}
|
}
|
||||||
list.clear();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,15 +18,15 @@ public:
|
|||||||
}
|
}
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
void Store(QString SeriesUid,int slice,Measure* measure);
|
void Store(QString SeriesUid, int plane, int slice,Measure* measure);
|
||||||
void Remove(Measure* measure);
|
void Remove(Measure* measure);
|
||||||
void RemoveAllInSlice(QString SeriesUid,int slice);
|
void RemoveAllInSlice(QString SeriesUid,int plane,int slice);
|
||||||
void RemoveAllInSeries(QString SeriesUid);
|
void RemoveAllInSeries(QString SeriesUid);
|
||||||
void Clear();
|
void Clear();
|
||||||
QList<Measure*>* GetMeasures(QString SeriesUid, int slice);
|
QList<Measure*>* GetMeasures(QString SeriesUid, int plane, int slice);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QMap<QString,QMap<int,QList<Measure*>>> store;
|
QMap<QString, QMap<int, QMap<int,QList<Measure*>>>> store;
|
||||||
static MeasureStore* instance;
|
static MeasureStore* instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user