Measurement suit for MPR mode.

This commit is contained in:
Krad
2022-04-02 16:12:40 +08:00
parent b88efa3b25
commit 360c48e085
5 changed files with 56 additions and 50 deletions

View File

@@ -1,4 +1,4 @@
#include "QDicomViewer.h"
#include "QDicomViewer.h"
#include "global/include_all.h"
#include "base/SeriesImageSet.h"
#include "view/subview/gridpopwidget.h"
@@ -11,18 +11,11 @@
#include <QMenu>
#include <QButtonGroup>
#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 <QMessageBox>
#include "measure/ActorDraggableInteractorStyle.h""
#include "measure/ActorDraggableInteractorStyle.h"
/************************************************************************
* Consider:
@@ -331,11 +324,11 @@ void QDicomViewer::SetupAnnoTool(QToolButton* annoBtn)
//AnnotationActor执行相关
//TODO:考虑从这个类中移除采用factory模式解耦合
void QDicomViewer::executeActiveMeasure(ViewContainerWidget* Container, AnnotationActorType annType)
void QDicomViewer::executeActiveMeasure()
{
ui->viewContainer->activeMeasure();
DicomImageView* curV = ui->viewContainer->getCurrentView();
switch (annType)
switch (MeasureHelper::getMeasureType())
{
case AnnotationActorType::DeleteSelectedAnn:
if (curV != nullptr)
@@ -367,7 +360,7 @@ void QDicomViewer::SetupMeasureTool(QToolButton* measureBtn)
measureBtn->setToolTip(QString("Measurements"));
connect(measureBtn, &QToolButton::clicked, this, [=] {
executeActiveMeasure(ui->viewContainer, m_cur_measure);
executeActiveMeasure();
});
QMenu* m;

View File

@@ -91,10 +91,8 @@ private:
/**
* 按照annType的类型在Container中执行对应的Measurement操作
* @param Container 包含RenderWindow的QTWidget容器
* @param annType 需要执行操作的AnnotationActorType
*/
void executeActiveMeasure(ViewContainerWidget *Container, AnnotationActorType annType);
void executeActiveMeasure();
/**
* 为对应的DicomImageView构建对应的播放控件

View File

@@ -866,7 +866,8 @@ void infinitiViewer::LoadMeasures(bool forceReload) {
}
void infinitiViewer::ReloadCurrentSliceMeasure() {
list = measureStore->GetMeasures(SOP_UID, ImageMapper->GetSliceNumber());
list = measureStore->GetMeasures(SOP_UID, this->SliceOrientation, ImageMapper->GetSliceNumber());
if (list)
{
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) {
auto m = static_cast<Measure*>(calldata);
if (m->Valid()) {
measureStore->Store(SOP_UID, this->ImageMapper->GetSliceNumber(), m);
measureStore->Store(SOP_UID, this->SliceOrientation,this->ImageMapper->GetSliceNumber(), m);
}
LoadMeasures(true);
this->Render();
@@ -918,7 +919,7 @@ void infinitiViewer::DeleteSelectedMeasure() {
void infinitiViewer::DeleteCurrentSliceMeasure() {
this->InteractorStyle->ClearSelectedProp();
ClearCurrentSliceMeasure();
measureStore->RemoveAllInSlice(SOP_UID, this->ImageMapper->GetSliceNumber());
measureStore->RemoveAllInSlice(SOP_UID, this->SliceOrientation, this->ImageMapper->GetSliceNumber());
ReloadCurrentSliceMeasure();
this->Render();
}

View File

@@ -4,37 +4,49 @@
#include "MeasureStore.h"
#include "Measure.h"
#include "qdebug.h"
#include <algorithm>
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)){
store[SeriesUid]=QMap<int,QList<Measure*>>();
store[SeriesUid]=QMap<int, QMap<int,QList<Measure*>>>();
}
if (!store[SeriesUid].contains(slice)){
store[SeriesUid][slice] = QList<Measure*>();
if (!store[SeriesUid].contains(plane)){
store[SeriesUid][plane] = QMap<int,QList<Measure*>>();
}
if(store[SeriesUid][slice].contains(measure)) return;
measure->SetMeasureID(QString("%1-%2").arg(SeriesUid).arg(slice));
store[SeriesUid][slice].push_back(measure);
if (!store[SeriesUid][plane].contains(slice)){
store[SeriesUid][plane][slice] = QList<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) {
if (!store.contains(SeriesUid)) return nullptr;
if (!store[SeriesUid].contains(slice))return nullptr;
return &store[SeriesUid][slice];
QList<Measure *>* MeasureStore::GetMeasures(QString SeriesUid, int plane, int slice) {
qDebug()<<"measure SeriesUid:"<<SeriesUid<<", plane:"<<plane<<", slice:"<<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) {
QString id = measure->GetMeasureID();
QStringList list = id.split("-");
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) {
for (auto item:store[SeriesUid][slice]) {
void MeasureStore::RemoveAllInSlice(QString SeriesUid, int plane, int slice) {
for (auto item:store[SeriesUid][plane][slice]) {
item->ForceDelete();
}
store[SeriesUid][slice].clear();
@@ -42,9 +54,11 @@ void MeasureStore::RemoveAllInSlice(QString SeriesUid,int slice) {
void MeasureStore::RemoveAllInSeries(QString SeriesUid) {
for (auto series:store[SeriesUid]) {
for (auto item: series)
{
item->ForceDelete();
for (auto plane :series) {
for (auto item: plane) {
item->ForceDelete();
}
plane.clear();
}
series.clear();
}
@@ -54,16 +68,16 @@ void MeasureStore::RemoveAllInSeries(QString SeriesUid) {
void MeasureStore::Clear() {
for(auto item: store)
{
for (auto list :item)
{
for (auto m : list)
{
if (m){
m->ForceDelete();
m=nullptr;
for (auto plane :item) {
for (auto list :plane) {
for (auto m : list) {
if (m) {
m->ForceDelete();
m = nullptr;
}
}
list.clear();
}
list.clear();
}
}
}

View File

@@ -18,15 +18,15 @@ public:
}
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 RemoveAllInSlice(QString SeriesUid,int slice);
void RemoveAllInSlice(QString SeriesUid,int plane,int slice);
void RemoveAllInSeries(QString SeriesUid);
void Clear();
QList<Measure*>* GetMeasures(QString SeriesUid, int slice);
QList<Measure*>* GetMeasures(QString SeriesUid, int plane, int slice);
private:
QMap<QString,QMap<int,QList<Measure*>>> store;
QMap<QString, QMap<int, QMap<int,QList<Measure*>>>> store;
static MeasureStore* instance;
};