Load data memory fix.(corner anno caused)
This commit is contained in:
@@ -19,6 +19,7 @@ class SeriesImageSet;
|
||||
class DICOMDirectoryHelper;
|
||||
class ExtendMedicalImageProperties;
|
||||
class vtkDICOMImageReader2;
|
||||
typedef std::map<std::string, SeriesImageSet*> ImageSetStore;
|
||||
|
||||
class DicomLoader {
|
||||
public:
|
||||
@@ -53,8 +54,8 @@ public:
|
||||
}
|
||||
|
||||
|
||||
//if not duplicate
|
||||
SeriesImageSet* InitFromRead(const UniqueIDInfo &uniqueID);// , DicomTagInfo_t* tag_info);
|
||||
|
||||
SeriesImageSet* getSeriesImageSet(const UniqueIDInfo &uniqueID);
|
||||
|
||||
SeriesInfo_t* getSerieInfo(const UniqueIDInfo &uniqueID);
|
||||
SeriesImageSet* getFirstInstance(const UniqueIDInfo &uniqueID);
|
||||
@@ -84,7 +85,7 @@ private:
|
||||
ExtendMedicalImageProperties * currentImageProperty = nullptr;
|
||||
std::vector<ExtendMedicalImageProperties*> imageProperties;
|
||||
vtkDICOMImageReader2 * reader = nullptr;
|
||||
|
||||
ImageSetStore store;
|
||||
AddDicomType m_addType;
|
||||
PatientsMapType m_patients;
|
||||
vtkObject* placeHolder;
|
||||
|
||||
@@ -46,6 +46,11 @@ public slots:
|
||||
void Slot_ViewClicked(DicomImageView *view);
|
||||
void Slot_ViewDoubleClicked(DicomImageView *view);
|
||||
void Slot_DragDropEvent(DicomImageView *view, thumbnailImage* tb);
|
||||
/**
|
||||
* 缩略图点击槽函数,会导致当前选中的view重新load数据
|
||||
* @param tb 缩略图对象
|
||||
* @return
|
||||
*/
|
||||
void Slot_ThumbnailClickEvent(thumbnailImage* tb);
|
||||
void Slot_SyncEvent(DicomImageView *view, int interactionMode, void* calldata);
|
||||
|
||||
|
||||
@@ -154,8 +154,15 @@ bool DicomLoader::IsDuplicate(UniqueIDInfo_t* unique)
|
||||
|
||||
|
||||
|
||||
SeriesImageSet* DicomLoader::InitFromRead(const UniqueIDInfo &uniqueID)//, DicomTagInfo_t* tag_info)
|
||||
SeriesImageSet* DicomLoader::getSeriesImageSet(const UniqueIDInfo &uniqueID)//, DicomTagInfo_t* tag_info)
|
||||
{
|
||||
//only user key to the series level
|
||||
auto key = uniqueID.patient_name+uniqueID.study_uid+uniqueID.series_uid;
|
||||
if (store.count(key)>0)
|
||||
{
|
||||
//use cache instead load
|
||||
return store[key];
|
||||
}
|
||||
if (reader) reader->Delete();
|
||||
reader = vtkDICOMImageReader2::New();
|
||||
reader->SetFileNames(*(currentImageProperty->GetFileNames()));
|
||||
@@ -163,6 +170,7 @@ SeriesImageSet* DicomLoader::InitFromRead(const UniqueIDInfo &uniqueID)//, Dicom
|
||||
SeriesImageSet* result = new SeriesImageSet(uniqueID,currentImageProperty,reader->GetOutput());
|
||||
reader->Delete();
|
||||
reader = nullptr;
|
||||
store[key] = result;
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -398,7 +406,7 @@ DicomTagInfo_t* DicomLoader::createDicomTagsInfo()
|
||||
SeriesImageSet* DicomLoader::createSeries(UniqueIDInfo_t* uniqueID)
|
||||
{
|
||||
|
||||
SeriesImageSet* series =instance->InitFromRead(*uniqueID);
|
||||
SeriesImageSet* series = instance->getSeriesImageSet(*uniqueID);
|
||||
|
||||
series->setUpSeriesInstance();
|
||||
return series;
|
||||
|
||||
@@ -355,6 +355,7 @@ infinitiViewer::~infinitiViewer()
|
||||
{
|
||||
if (this->ImageMapper)
|
||||
{
|
||||
this->ImageMapper->SetInputData(nullptr);
|
||||
this->ImageMapper->Delete();
|
||||
this->ImageMapper = nullptr;
|
||||
}
|
||||
@@ -363,6 +364,7 @@ infinitiViewer::~infinitiViewer()
|
||||
this->ImageActor->Delete();
|
||||
this->ImageActor = nullptr;
|
||||
}
|
||||
|
||||
if (this->FusionMapper)
|
||||
{
|
||||
this->FusionMapper->Delete();
|
||||
@@ -394,9 +396,14 @@ infinitiViewer::~infinitiViewer()
|
||||
|
||||
if (this->InteractorStyle)
|
||||
{
|
||||
this->InteractorStyle->SetCornerAnnotation(nullptr);
|
||||
this->InteractorStyle->Delete();
|
||||
this->InteractorStyle = nullptr;
|
||||
}
|
||||
if (this->cornerAnnotation) {
|
||||
this->cornerAnnotation->Delete();
|
||||
this->cornerAnnotation = nullptr;
|
||||
}
|
||||
measureStore->RemoveAllInSeries(SOP_UID);
|
||||
// measureStore->Clear();
|
||||
//delete measureStore;
|
||||
@@ -1202,14 +1209,14 @@ void infinitiViewer::initTopLeftCornerInfo(const std::string& lbl_ser_num, const
|
||||
|
||||
void infinitiViewer::initCornerInfo(ExtendMedicalImageProperties* pSeries)
|
||||
{
|
||||
if(pSeries->GetNumberOfWindowLevelPresets()>0)
|
||||
if (pSeries->GetNumberOfWindowLevelPresets() > 0)
|
||||
{
|
||||
double * wwwl = pSeries->GetNthWindowLevelPreset(0);
|
||||
double* wwwl = pSeries->GetNthWindowLevelPreset(0);
|
||||
m_cornerInfo.win_level = (int)wwwl[1];
|
||||
m_cornerInfo.win_width = (int)wwwl[0];
|
||||
}
|
||||
|
||||
char buffer [sizeof(long)*8+1];
|
||||
char buffer[sizeof(long) * 8 + 1];
|
||||
const char* s = ltoa(pSeries->GetFileNames()->size(), buffer, 10);
|
||||
m_cornerInfo.ConstAnno[TOP_LEFT].append(buffer);
|
||||
m_cornerInfo.ConstAnno[TOP_LEFT].append(" ");
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
#include "QGlobals.h"
|
||||
vtkStandardNewMacro(ActorDraggableInteractorStyle);
|
||||
ActorDraggableInteractorStyle::ActorDraggableInteractorStyle() {
|
||||
this->AddObserver(vtkCommand::InteractionEvent,this,&ActorDraggableInteractorStyle::DispatchEvent);
|
||||
this->AddObserver(vtkCommand::InteractionEvent, this, &ActorDraggableInteractorStyle::DispatchEvent);
|
||||
#ifdef _DEBUG
|
||||
this->AddObserver(DraggableStyleEvents::EndDollyEvent, this, &ActorDraggableInteractorStyle::TestOutPut);
|
||||
this->AddObserver(vtkCommand::EventIds::EndPanEvent, this, &ActorDraggableInteractorStyle::TestOutPut);
|
||||
@@ -40,7 +40,13 @@ ActorDraggableInteractorStyle::ActorDraggableInteractorStyle() {
|
||||
}
|
||||
|
||||
ActorDraggableInteractorStyle::~ActorDraggableInteractorStyle() {
|
||||
|
||||
if (scalarProp) {
|
||||
scalarProp->Delete();
|
||||
scalarProp = nullptr;
|
||||
}
|
||||
if (CornerAnnotation) {
|
||||
CornerAnnotation->UnRegister(this);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
@@ -75,9 +81,9 @@ void ActorDraggableInteractorStyle::OnLeftButtonUp() {
|
||||
this->EndMeasure();
|
||||
auto temp = measure;
|
||||
measure = measure->GetNextMeasure();
|
||||
if (!temp->Valid()){
|
||||
if (!temp->Valid()) {
|
||||
temp->ForceDelete();
|
||||
temp= nullptr;
|
||||
temp = nullptr;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -90,11 +96,11 @@ void ActorDraggableInteractorStyle::OnLeftButtonUp() {
|
||||
void ActorDraggableInteractorStyle::ColorMapping()
|
||||
{
|
||||
|
||||
vtkRenderWindowInteractor *rwi = this->Interactor;
|
||||
vtkRenderWindowInteractor* rwi = this->Interactor;
|
||||
this->ScalarCurrentPosition[1] = rwi->GetEventPosition()[1];
|
||||
|
||||
//pos[0] = (this->ScalarCurrentPosition[0] - this->ScalarStartPosition[0]);
|
||||
double total = 0.01*((this->ScalarCurrentPosition[1] - this->ScalarStartPosition[1])/scalarSensitivity);
|
||||
double total = 0.01 * ((this->ScalarCurrentPosition[1] - this->ScalarStartPosition[1]) / scalarSensitivity);
|
||||
double left = total - ConsumedOpacity;
|
||||
//printf("ColorMapping:%d,%d,%.2f \r\n", ScalarCurrentPosition[1], ScalarStartPosition[1],left);
|
||||
if (abs(left) >= 0.01) {
|
||||
@@ -121,7 +127,7 @@ void ActorDraggableInteractorStyle::EndColorMapping()
|
||||
|
||||
void ActorDraggableInteractorStyle::Drag() {
|
||||
int* pos = this->Interactor->GetEventPosition();
|
||||
this->FindPokedRenderer(pos[0],pos[1]);
|
||||
this->FindPokedRenderer(pos[0], pos[1]);
|
||||
DraggableActor::SafeDownCast(dragProp)->Transform(pos[0] - DragStartOrigin[0], pos[1] - DragStartOrigin[1]);
|
||||
this->Interactor->Render();
|
||||
}
|
||||
@@ -205,10 +211,10 @@ void ActorDraggableInteractorStyle::NoneStatePick() {
|
||||
scalarProp = nullptr;
|
||||
}
|
||||
dragProp = nullptr;
|
||||
this->CornerAnnotation->SetText(BOTTOM_LEFT, "");
|
||||
if (this->CornerAnnotation)this->CornerAnnotation->SetText(BOTTOM_LEFT, "");
|
||||
}
|
||||
}
|
||||
this->CornerAnnotation->SetText(BOTTOM_LEFT, "");
|
||||
if (this->CornerAnnotation)this->CornerAnnotation->SetText(BOTTOM_LEFT, "");
|
||||
this->Interactor->Render();
|
||||
|
||||
}
|
||||
@@ -244,7 +250,7 @@ void ActorDraggableInteractorStyle::OnMouseMove() {
|
||||
|
||||
void ActorDraggableInteractorStyle::WindowLevel()
|
||||
{
|
||||
vtkRenderWindowInteractor *rwi = this->Interactor;
|
||||
vtkRenderWindowInteractor* rwi = this->Interactor;
|
||||
|
||||
this->WindowLevelCurrentPosition[0] = rwi->GetEventPosition()[0];
|
||||
this->WindowLevelCurrentPosition[1] = rwi->GetEventPosition()[1];
|
||||
@@ -256,7 +262,7 @@ void ActorDraggableInteractorStyle::WindowLevel()
|
||||
}
|
||||
if (this->CurrentImageProperty)
|
||||
{
|
||||
int *size = this->CurrentRenderer->GetSize();
|
||||
int* size = this->CurrentRenderer->GetSize();
|
||||
|
||||
double window = this->WindowLevelInitial[0];
|
||||
double level = this->WindowLevelInitial[1];
|
||||
@@ -346,7 +352,7 @@ void ActorDraggableInteractorStyle::OnLeftButtonDown() {
|
||||
selectedProp->InvokeEvent(DraggableActor::DraggableActorEvents::UnSelectedEvent);
|
||||
selectedProp = nullptr;
|
||||
}
|
||||
if (dragProp){
|
||||
if (dragProp) {
|
||||
selectedProp = dragProp;
|
||||
selectedProp->InvokeEvent(DraggableActor::DraggableActorEvents::SelectedEvent);
|
||||
if (this->Interactor->GetRepeatCount())
|
||||
@@ -358,7 +364,7 @@ void ActorDraggableInteractorStyle::OnLeftButtonDown() {
|
||||
this->StartDrag();
|
||||
return;
|
||||
}
|
||||
if (Interactor->GetRepeatCount()){
|
||||
if (Interactor->GetRepeatCount()) {
|
||||
if (measure)
|
||||
{
|
||||
measure->SetPlacing(measure->onMeasureDoubleClick(this->Interactor));
|
||||
@@ -366,9 +372,9 @@ void ActorDraggableInteractorStyle::OnLeftButtonDown() {
|
||||
this->EndMeasure();
|
||||
auto temp = measure;
|
||||
measure = measure->GetNextMeasure();
|
||||
if (!temp->Valid()){
|
||||
if (!temp->Valid()) {
|
||||
temp->ForceDelete();
|
||||
temp= nullptr;
|
||||
temp = nullptr;
|
||||
}
|
||||
}
|
||||
return;
|
||||
@@ -379,7 +385,7 @@ void ActorDraggableInteractorStyle::OnLeftButtonDown() {
|
||||
if (measure)
|
||||
{
|
||||
measure->SetPlacing(measure->onMeasureLeftButtonDown(this->Interactor));
|
||||
if(this->State!=VTKIS_MEASURE) this->StartMeasure();
|
||||
if (this->State != VTKIS_MEASURE) this->StartMeasure();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -414,7 +420,7 @@ void ActorDraggableInteractorStyle::OnLeftButtonDown() {
|
||||
|
||||
}
|
||||
|
||||
void ActorDraggableInteractorStyle::ActiveMeasure(Measure *m) {
|
||||
void ActorDraggableInteractorStyle::ActiveMeasure(Measure* m) {
|
||||
if (this->measure && nullptr == m) {
|
||||
this->measure->onTerminate(this->Interactor);
|
||||
}
|
||||
@@ -440,8 +446,8 @@ void ActorDraggableInteractorStyle::DispatchEvent() {
|
||||
this->SetCurrentImageNumber(this->CurrentImageNumber);
|
||||
}
|
||||
if (!this->CurrentImageSlice) return;
|
||||
vtkImageSliceMapper *mapper = vtkImageSliceMapper::SafeDownCast(this->CurrentImageSlice->GetMapper());
|
||||
int slice[1] = {mapper ? mapper->GetSliceNumber() : -1};
|
||||
vtkImageSliceMapper* mapper = vtkImageSliceMapper::SafeDownCast(this->CurrentImageSlice->GetMapper());
|
||||
int slice[1] = { mapper ? mapper->GetSliceNumber() : -1 };
|
||||
//鼠标滑动不一定能造成翻页!!!所以需要进行一次判定
|
||||
if (slice[0] != lastslice) {
|
||||
this->InvokeEvent(DraggableStyleEvents::SlicedEvent, slice);
|
||||
@@ -546,8 +552,8 @@ void ActorDraggableInteractorStyle::EndDolly() {
|
||||
}
|
||||
//激发缩放完成事件
|
||||
if (this->HandleObservers) {
|
||||
vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
|
||||
double result[2] = {0.0, 0.0};
|
||||
vtkCamera* camera = this->CurrentRenderer->GetActiveCamera();
|
||||
double result[2] = { 0.0, 0.0 };
|
||||
//image 必然是ParallelProjection
|
||||
result[0] = this->DollyStartScale;
|
||||
result[1] = camera->GetParallelScale();
|
||||
@@ -564,9 +570,9 @@ void ActorDraggableInteractorStyle::StartPan() {
|
||||
void ActorDraggableInteractorStyle::EndPan() {
|
||||
if (this->State != VTKIS_PAN) return;
|
||||
if (this->HandleObservers) {
|
||||
vtkCamera *camera = this->CurrentRenderer->GetActiveCamera();
|
||||
double *nf = camera->GetFocalPoint();
|
||||
double calldata[6] = {PanStartOrigin[0], PanStartOrigin[1], PanStartOrigin[2], nf[0], nf[1], nf[2]};
|
||||
vtkCamera* camera = this->CurrentRenderer->GetActiveCamera();
|
||||
double* nf = camera->GetFocalPoint();
|
||||
double calldata[6] = { PanStartOrigin[0], PanStartOrigin[1], PanStartOrigin[2], nf[0], nf[1], nf[2] };
|
||||
this->InvokeEvent(vtkCommand::EventIds::EndPanEvent, calldata);
|
||||
}
|
||||
this->StopState();
|
||||
@@ -577,7 +583,7 @@ void ActorDraggableInteractorStyle::EndWindowLevel() {
|
||||
return;
|
||||
}
|
||||
if (this->HandleObservers) {
|
||||
double calldata[2] = {this->CurrentImageProperty->GetColorWindow(),this->CurrentImageProperty->GetColorLevel()};
|
||||
double calldata[2] = { this->CurrentImageProperty->GetColorWindow(),this->CurrentImageProperty->GetColorLevel() };
|
||||
this->InvokeEvent(vtkCommand::EndWindowLevelEvent, calldata);
|
||||
}
|
||||
this->StopState();
|
||||
@@ -586,11 +592,11 @@ void ActorDraggableInteractorStyle::OnChar() {
|
||||
vtkInteractorStyleImage::OnChar();
|
||||
vtkRenderWindowInteractor* rwi = this->Interactor;
|
||||
std::string keySym = rwi->GetKeySym();
|
||||
if (keySym=="Delete")
|
||||
if (keySym == "Delete")
|
||||
{
|
||||
if (selectedProp)
|
||||
{
|
||||
this->InvokeEvent(DraggableStyleEvents::DeleteMeasureEvent,selectedProp);
|
||||
this->InvokeEvent(DraggableStyleEvents::DeleteMeasureEvent, selectedProp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -684,6 +684,9 @@ void DicomImageView::Render()
|
||||
|
||||
void DicomImageView::CopyFromSeries(SeriesImageSet *series)
|
||||
{
|
||||
if (_Series){
|
||||
delete _Series;
|
||||
}
|
||||
_Series = series;
|
||||
|
||||
_ImageViewer->SetInputData(_Series->GetData());
|
||||
@@ -804,16 +807,14 @@ void DicomImageView::ResetView()
|
||||
|
||||
removeViewWithFusion();
|
||||
removeViewWithMeasure();
|
||||
|
||||
|
||||
|
||||
|
||||
orphanizeSeriesInstance();
|
||||
//_glWidt->update();
|
||||
|
||||
//_scrollBar = nullptr;
|
||||
_ImageViewer->Delete();
|
||||
_ImageViewer = nullptr;
|
||||
int count = _Series->GetData()->GetReferenceCount();
|
||||
qDebug()<<count;
|
||||
_Series = nullptr;
|
||||
|
||||
_ScrollTriggerType = scrollScope::TriggerType::USER_TRIGGER;
|
||||
|
||||
@@ -407,13 +407,6 @@ void ViewContainerWidget::Slot_ThumbnailClickEvent(thumbnailImage* tb)
|
||||
return;
|
||||
}
|
||||
SeriesInfo_t* serie_info = tb->getSeriesInfo();
|
||||
SeriesImageSet* old = nullptr;
|
||||
bool copy = true;
|
||||
|
||||
if (view->HasSeries())
|
||||
{
|
||||
old = view->getSeriesInstance();
|
||||
}
|
||||
replaceViewWithSerie(serie_info->unique_info, view);
|
||||
setCurrentView(view);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user