3
* $Id: visualizatorstudy.cpp 3645 2011-04-04 09:21:08Z tovar $
6
* Copyright 2008-10 MetaEmotion S.L. All rights reserved.
7
* http://ginkgo-cadx.com
9
* This file is licensed under LGPL v3 license.
10
* See License.txt for details
14
//#define _GINKGO_TRACE
17
#include <wx/xml/xml.h>
19
#include <wx/filename.h>
20
#include <wx/confbase.h>
21
#include <wx/mstream.h>
23
#include <api/globals.h>
24
//#include <api/filename.h>
25
#include <api/icontroladorherramientas.h>
26
#include <api/ientorno.h>
28
#include <api/idicommanager.h>
29
#include <api/idicomizador.h>
30
#include <api/icontroladorcarga.h>
31
#include <api/imodelointegracion.h>
32
#include <api/icontroladorhistorial.h>
33
#include <api/internacionalizacion.h>
35
#include "visualizatorstudy.h"
37
#include <vtkPointData.h>
38
#include <vtkImageData.h>
41
GNKVisualizator::VisualizatorStudy::VisualizatorStudy(){
42
GTRACE(">> VisualizatorStudy::VisualizatorStudy()" << this);
43
GTRACE("<< VisualizatorStudy::VisualizatorStudy()" << this);
46
GNKVisualizator::VisualizatorStudy::~VisualizatorStudy(){
47
GTRACE(">> VisualizatorStudy::~VisualizatorStudy()" << this);
48
ListaOverlays.clear();
49
GTRACE("<< VisualizatorStudy::~VisualizatorStudy()" << this);
53
void GNKVisualizator::VisualizatorStudy::InicializarContextoEstudio(std::vector<std::string>& rutas, const std::string uidEstudioDiagnostico, GNC::GCS::IContextoEstudio::TModoFuncionamiento modoFuncionamiento)
55
GNC::GCS::IContextoEstudio::InicializarContextoEstudio(rutas,uidEstudioDiagnostico, modoFuncionamiento);
56
ListaOverlays.clear();
57
for (std::vector<std::string>::const_iterator it = rutas.begin(); it != rutas.end(); it++)
59
ListaOverlays.push_back(NULL);
63
bool GNKVisualizator::VisualizatorStudy::TieneOverlaysImagenActiva()
65
return TieneOverlaysImagen(IndiceFicheroActivo);
68
bool GNKVisualizator::VisualizatorStudy::TieneOverlaysImagen(const int indice)
70
//se pillan los overlays de la imagen original
71
if(ListaOverlays[indice].IsValid()) {
72
return ListaOverlays[indice]->size()>0;
74
GnkPtr<GIL::DICOM::TipoJerarquia> jerarq = GetTagsImagen(indice);
75
if (jerarq.IsValid()) {
76
for(GIL::DICOM::TipoJerarquia::ListaTags::iterator it = jerarq->tags.begin(); it != jerarq->tags.end(); it++) {
77
if((*it).first.substr(0,2) == "60") {
88
GnkPtr<GNKVisualizator::TListaOverlays> GNKVisualizator::VisualizatorStudy::GetOverlaysImagenActiva()
90
return GetOverlaysImagen(IndiceFicheroActivo);
93
GnkPtr<GNKVisualizator::TListaOverlays> GNKVisualizator::VisualizatorStudy::GetOverlaysImagen(const int indice)
95
if(!ListaOverlays[indice].IsValid()) {
96
ListaOverlays[indice] = new TListaOverlays();
99
GIL::DICOM::IDICOMManager* pDICOMManager= Entorno->GetControladorImportacionPACS()->CrearInstanciaDeDICOMManager();
100
pDICOMManager->CargarFichero(Ficheros[indice]->RutaImagen);
102
int filasImagen,columnasImagen;
103
//los overlays van en los grupos pares de 6000 a 601E, ver parte 5 del standard "repeating groups"
104
if(pDICOMManager->GetTag(0x0028,0x0010,filasImagen) && pDICOMManager->GetTag(0x0028,0x0011,columnasImagen)) {
105
for(int grupo = 0x6000; grupo <0x601E; grupo+=2)
107
int filas,columnas,desplazamiento;
108
std::string nombreCapa;
109
std::string origen, tipo;
110
GIL::DICOM::TagPrivadoUndefined overlayData;
111
int bitPosition,bitsAllocated;
112
if(pDICOMManager->GetTag(grupo,0x0010,filas) && pDICOMManager->GetTag(grupo,0x0011,columnas)
113
&& pDICOMManager->GetTag(grupo,0x0102,bitPosition) && pDICOMManager->GetTag(grupo,0x0100,bitsAllocated)){
114
//TODO: si no es del tamanio de la imagen de momento no lo tratamos, tendremos que crear una imagen del tamanio adecuado y pegar el roi en su sitio
115
if(filas!= filasImagen || columnas!=columnasImagen) {
118
pDICOMManager->GetTag(grupo,0x0040,tipo);
119
//TODO TRATAR DISTINTOS A LOS ROI por ejemplo mostrar la media y todo eso...
120
if(!pDICOMManager->GetTag(grupo,0x0022,nombreCapa)){
121
std::ostringstream ostrNombre;
122
ostrNombre <<"Capa " << idOver;
123
nombreCapa = ostrNombre.str();
125
TOverlay over(nombreCapa,grupo);
128
if(bitPosition==0 && bitsAllocated==1 && pDICOMManager->GetTag(grupo,0x3000,overlayData)) {
129
//este es el caso en el que la capa overlay esta especificada aparte, no usando bits d la imagen
131
vtkImageData* pimg = vtkImageData::New();
134
over.img->SetDimensions(columnas,filas,1);
135
over.img->SetScalarTypeToUnsignedChar();
136
over.img->SetNumberOfScalarComponents(1);
142
if(pDICOMManager->GetTag(grupo,0x0050,origen)){
143
std::istringstream issl(origen);
150
over.img->SetOrigin(x,y,1.0f);
152
over.img->AllocateScalars();
154
unsigned char* pData = (unsigned char*)over.img->GetScalarPointer();
155
const unsigned char * ptr = (const unsigned char *)overlayData.GetValor();
157
int size = overlayData.GetSize();
158
int sizeOfImage = filas*columnas;
159
//double tuple[1] = {0.0f};
162
for(int i=0; i<size; i++){
163
c = (const unsigned char) (ptr[i]);
165
for(int j=0; j<8 && off<sizeOfImage; j++){
174
ListaOverlays[indice]->push_back(over);
176
int bitsAllocatedImagen;
177
//en este caso el overlay esta en el pixeldata, esta retired pero asi funcionan tb los viejos
178
if(pDICOMManager->GetTag(0x0028,0x0100,bitsAllocatedImagen) && pDICOMManager->GetTag(0x7fe0,0x0010,overlayData) && overlayData.GetSize() > 0) {
179
vtkImageData* tmp = vtkImageData::New();
182
over.img->SetDimensions(columnas,filas,1);
183
over.img->SetScalarTypeToUnsignedChar();
184
over.img->SetNumberOfScalarComponents(1);
190
if(pDICOMManager->GetTag(grupo,0x0050,origen)){
191
std::istringstream issl(origen);
198
over.img->SetOrigin(x,y,1.0f);
200
over.img->AllocateScalars();
202
unsigned char* pData = (unsigned char*)over.img->GetScalarPointer();
203
const unsigned char * ptr = (const unsigned char *)overlayData.GetValor();
205
int size = overlayData.GetSize();
206
//int sizeOfImage = filas*columnas;
207
//double tuple[1] = {0.0f};
208
if(bitsAllocatedImagen == 8 && bitPosition<8) {
209
//se itera caracter a caracter...
213
mascara <<= bitPosition;
214
for (int y = 0; y < filas; y++) {
215
desplazamiento = y*columnas;
216
for (int x = 0; x < columnas && off < size; x++) {
217
c = (unsigned char) *(ptr + desplazamiento + x);
218
if((mascara & c)==0) {
225
ListaOverlays[indice]->push_back(over);
226
} else if(bitsAllocatedImagen == 16 && bitPosition<16){
227
//se itera con 16 bits...
228
unsigned char mascara;
231
unsigned char bitAConsultar = 0;
234
mascara <<= bitPosition;
237
mascara <<= (bitPosition-8);
240
for (int y = 0; y < filas; y++) {
241
desplazamiento = y*columnas;
242
for (int x = 0; x < columnas && off < size; ++x) {
243
c = (unsigned char*) (ptr + 2*(desplazamiento + x)+bitAConsultar);
244
if((mascara & (*c))==0) {
251
ListaOverlays[indice]->push_back(over);
252
}//else bits allocated
253
}//if get pixel data y comprobaciones
254
}//else overlay por separado
255
}//if columnas, bits...
257
}//si esta especificado filas/columnas de la imagen
258
Entorno->GetControladorImportacionPACS()->LiberarInstanciaDeDICOMManager(pDICOMManager);
260
return ListaOverlays[indice];
263
bool GNKVisualizator::VisualizatorStudy::CallbackPreCrearDiagnostico(const int indice, GIL::DICOM::TipoJerarquia* pJerarquiaSR, std::list<GnkPtr<GIL::DICOM::TipoPrivateTags> >& /*listaTagsPrivados*/)
265
pJerarquiaSR->tags[std::string("0008|1030")] = _Std("Medical Diagnostic"); //descripcion study
266
pJerarquiaSR->tags[std::string("0008|103e")] = _Std("Medical Diagnostic"); //descripcion Serie
267
pJerarquiaSR->tags[std::string("0020|4000")] = _Std("Medical Diagnostic");//descripcion de la imagen