fix: fix delete measure crash bug
This commit is contained in:
@@ -9,22 +9,23 @@ MeasureStore *MeasureStore::instance = nullptr;
|
|||||||
|
|
||||||
void MeasureStore::Store(QString SeriesUid, int plane, 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, QMap<int, QList<Measure *>>>();
|
store[SeriesUid] = QMap<int, QMap<int, std::shared_ptr<QList<Measure *>>>>();
|
||||||
}
|
}
|
||||||
if (!store[SeriesUid].contains(plane)) {
|
if (!store[SeriesUid].contains(plane)) {
|
||||||
store[SeriesUid][plane] = QMap<int, QList<Measure *>>();
|
store[SeriesUid][plane] = QMap<int, std::shared_ptr<QList<Measure *>>>();
|
||||||
}
|
}
|
||||||
if (!store[SeriesUid][plane].contains(slice)) {
|
if (!store[SeriesUid][plane].contains(slice)) {
|
||||||
store[SeriesUid][plane][slice] = QList<Measure *>();
|
std::shared_ptr< QList<Measure *>> p(new QList<Measure *>());
|
||||||
|
store[SeriesUid][plane][slice] = p;
|
||||||
}
|
}
|
||||||
measure->SetMeasureID(
|
measure->SetMeasureID(
|
||||||
QString("%1-%2-%3-%4").arg(SeriesUid).arg(plane).arg(slice).arg(store[SeriesUid][plane][slice].size()));
|
QString("%1-%2-%3-%4").arg(SeriesUid).arg(plane).arg(slice).arg(store[SeriesUid][plane][slice]->size()));
|
||||||
qDebug() << "store MeasureID:" << measure->GetMeasureID();
|
qDebug() << "store MeasureID:" << measure->GetMeasureID();
|
||||||
store[SeriesUid][plane][slice].push_back(measure);
|
store[SeriesUid][plane][slice]->push_back(measure);
|
||||||
qDebug() << "measure count:" << store[SeriesUid][plane][slice].size();
|
// qDebug() << "measure count:" << store[SeriesUid][plane][slice].size();
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<Measure *> *MeasureStore::GetMeasures(QString SeriesUid, int plane, int slice) {
|
std::shared_ptr<QList<Measure *>> MeasureStore::GetMeasures(QString SeriesUid, int plane, int slice) {
|
||||||
|
|
||||||
// qDebug() << "measure SeriesUid:" << SeriesUid << ", plane:" << plane << ", slice:" << slice;
|
// qDebug() << "measure SeriesUid:" << SeriesUid << ", plane:" << plane << ", slice:" << slice;
|
||||||
if (!store.contains(SeriesUid))
|
if (!store.contains(SeriesUid))
|
||||||
@@ -33,32 +34,33 @@ QList<Measure *> *MeasureStore::GetMeasures(QString SeriesUid, int plane, int sl
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
if (!store[SeriesUid][plane].contains(slice))
|
if (!store[SeriesUid][plane].contains(slice))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
qDebug() << "measure count:" << store[SeriesUid][plane][slice].size();
|
qDebug() << "measure count:" << store[SeriesUid][plane][slice]->size();
|
||||||
return &store[SeriesUid][plane][slice];
|
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()][list[2].toInt()].removeOne(measure);
|
store[list[0]][list[1].toInt()][list[2].toInt()]->removeOne(measure);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeasureStore::RemoveAllInSlice(QString SeriesUid, int plane, int slice) {
|
void MeasureStore::RemoveAllInSlice(QString SeriesUid, int plane, int slice) {
|
||||||
for (auto item:store[SeriesUid][plane][slice]) {
|
for (auto item:(*store[SeriesUid][plane][slice])) {
|
||||||
item->ForceDelete();
|
item->ForceDelete();
|
||||||
}
|
}
|
||||||
store[SeriesUid][plane][slice].clear();
|
store[SeriesUid][plane][slice]->clear();
|
||||||
|
store[SeriesUid][plane].remove(slice);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeasureStore::RemoveAllInSeries(QString SeriesUid) {
|
void MeasureStore::RemoveAllInSeries(QString SeriesUid) {
|
||||||
for (auto series:store[SeriesUid]) {
|
for (auto series:store[SeriesUid]) {
|
||||||
for (auto plane :series) {
|
for (auto plane :series) {
|
||||||
for (auto item: plane) {
|
for (auto item: *plane) {
|
||||||
item->ForceDelete();
|
item->ForceDelete();
|
||||||
}
|
}
|
||||||
plane.clear();
|
plane->clear();
|
||||||
}
|
}
|
||||||
series.clear();
|
series.clear();
|
||||||
}
|
}
|
||||||
@@ -69,13 +71,13 @@ void MeasureStore::Clear() {
|
|||||||
for (auto item: store) {
|
for (auto item: store) {
|
||||||
for (auto plane :item) {
|
for (auto plane :item) {
|
||||||
for (auto list :plane) {
|
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ class Measure;
|
|||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
class MeasureStore {
|
class MeasureStore {
|
||||||
public:
|
public:
|
||||||
@@ -29,10 +30,10 @@ public:
|
|||||||
|
|
||||||
void Clear();
|
void Clear();
|
||||||
|
|
||||||
QList<Measure *> *GetMeasures(QString SeriesUid, int plane, int slice);
|
std::shared_ptr<QList<Measure *>> GetMeasures(QString SeriesUid, int plane, int slice);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QMap<QString, QMap<int, QMap<int, QList<Measure *>>>> store;
|
QMap<QString, QMap<int, QMap<int, std::shared_ptr<QList<Measure *>>>>> store;
|
||||||
static MeasureStore *instance;
|
static MeasureStore *instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1133,17 +1133,20 @@ void DICOMImageViewer::LoadMeasures(bool forceReload) {
|
|||||||
void DICOMImageViewer::ReloadCurrentSliceMeasure() {
|
void DICOMImageViewer::ReloadCurrentSliceMeasure() {
|
||||||
list = measureStore->GetMeasures(SERIES_UID, this->SliceIJK, ImageMapper->GetSliceNumber());
|
list = measureStore->GetMeasures(SERIES_UID, this->SliceIJK, ImageMapper->GetSliceNumber());
|
||||||
|
|
||||||
if (list) {
|
if (list.use_count()>1) {
|
||||||
for (int i = 0; i < list->length(); i++) {
|
for (int i = 0; i < list->length(); i++) {
|
||||||
auto item = list->value(i);
|
auto item = list->value(i);
|
||||||
auto d = dynamic_cast<DraggableActor *>(item);
|
auto d = dynamic_cast<DraggableActor *>(item);
|
||||||
if (d) d->SetRenderer(GetRenderer());
|
if (d) d->SetRenderer(GetRenderer());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
list.reset();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DICOMImageViewer::ClearCurrentSliceMeasure() const {
|
void DICOMImageViewer::ClearCurrentSliceMeasure() const {
|
||||||
if (list) {
|
if (list.use_count()>1) {
|
||||||
for (int i = 0; i < list->length(); i++) {
|
for (int i = 0; i < list->length(); i++) {
|
||||||
auto item = list->value(i);
|
auto item = list->value(i);
|
||||||
auto d = dynamic_cast<DraggableActor *>(item);
|
auto d = dynamic_cast<DraggableActor *>(item);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#ifndef infinitiViewer_h
|
#ifndef infinitiViewer_h
|
||||||
#define infinitiViewer_h
|
#define infinitiViewer_h
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include "vtkInteractionImageModule.h" // For export macro
|
#include "vtkInteractionImageModule.h" // For export macro
|
||||||
#include "vtkObject.h"
|
#include "vtkObject.h"
|
||||||
#include "vector"
|
#include "vector"
|
||||||
@@ -423,7 +424,7 @@ private:
|
|||||||
//for convert vtkEvent to Qt signal
|
//for convert vtkEvent to Qt signal
|
||||||
vtkSignalRaiser raiser;
|
vtkSignalRaiser raiser;
|
||||||
|
|
||||||
QList<Measure *> *list = nullptr;
|
std::shared_ptr<QList<Measure *>> list;
|
||||||
|
|
||||||
MeasureStore *measureStore;
|
MeasureStore *measureStore;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user