/*========================================================================= Program: wxMaracas Module: $RCSfile: wxILPDwithImage.cxx,v $ Language: C++ Date: $Date: 2008/10/31 16:32:09 $ Version: $Revision: 1.1 $ Copyright: (c) 2002, 2003 License: This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "wxILPDwithImage.h" #include "ILPD/src/controlerInterface/ILPDViewListPatient.h" #include "ILPD/src/wxInterface/ILPDViewWxWindow.h" #include #include #include "vtkGdcmReader.h" #include "marImageData.h" #include "marGdcmDicom.h" #include //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(wxILPDwithImage , wxPanel) EVT_MENU(20001, wxILPDwithImage::OnSelectPatientStudySerieImage) END_EVENT_TABLE() //---------------------------------------------------------------------------- wxILPDwithImage::wxILPDwithImage(wxWindow *parent) : wxPanel(parent, -1) { _wxvtk2Dbaseview = NULL; _vtkbasedata = NULL; wxPanel *panel=this; panel->SetAutoLayout(true); wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL ); _pnlSplitter_ViewImage_wxILPD = new wxSplitterWindow( panel , -1); _wxILPD = new wxILPD( _pnlSplitter_ViewImage_wxILPD ); ILPDViewListPatient* _ilpdViewListPatient = new ILPDViewListPatient( new ILPDViewWxWindow(_wxILPD) ); wxPanel *viewPanel = CreatePanel_ViewImagePanel_WxILPD( _pnlSplitter_ViewImage_wxILPD ); topsizer -> Add( _pnlSplitter_ViewImage_wxILPD ,1,wxGROW ,0); int ww,hh; wxWindow *pp=this; while (pp->GetParent()!=NULL) pp=pp->GetParent(); pp->GetSize(&ww,&hh); GetSize(&ww,&hh); //EEDxx2.4 // pnlSplitter -> SplitHorizontally( viewPanel , _wxILPD, (int)(hh*0.45) ); _pnlSplitter_ViewImage_wxILPD -> SplitVertically( _wxILPD , viewPanel,300); _pnlSplitter_ViewImage_wxILPD -> SetMinimumPaneSize( 10 ); //EEDxx2.4 // panel->FitInside(); panel->SetSizer( topsizer ); // use the sizer for layout panel->Layout(); } //---------------------------------------------------------------------------- wxILPDwithImage::~wxILPDwithImage() { if (_vtkbasedata!=NULL) { delete _vtkbasedata; } if (_wxvtk2Dbaseview!=NULL) { delete _wxvtk2Dbaseview; } } //---------------------------------------------------------------------------- wxPanel *wxILPDwithImage::CreatePanel_ViewImagePanel_WxILPD( wxWindow *parent ) { wxPanel *panel =new wxPanel( parent, -1 ); wxBoxSizer *topsizer = new wxBoxSizer(wxHORIZONTAL ); _pnlSplitter_Image_DicomList = new wxSplitterWindow( panel , -1); _panelImage = new wxPanel(_pnlSplitter_Image_DicomList,-1); _panelImage->SetBackgroundColour( wxColour(0,0,0) ); wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL ); // _panelImage->SetAutoLayout(true); _panelImage->SetSizer( sizer ); // use the sizer for layout // _panelImage->Layout(); // _panelImage->FitInside(); int ww,hh; wxWindow *pp=this; while (pp->GetParent()!=NULL) pp=pp->GetParent(); pp->GetSize(&ww,&hh); _dicomPanelListView = new wxListView( _pnlSplitter_Image_DicomList, -1 ); _pnlSplitter_Image_DicomList->SetMinimumPaneSize( 200 ); //EEDxx2.4 // pnlSplitter -> SplitVertically( _panelImage, _dicomPanelListView, (int)(ww*0.45) ); _pnlSplitter_Image_DicomList -> SplitHorizontally( _panelImage, _dicomPanelListView, 300); topsizer -> Add( _pnlSplitter_Image_DicomList ,1,wxGROW ,0); panel->SetAutoLayout(true); panel->SetSizer( topsizer ); // use the sizer for layout panel->Layout(); //EEDxx2.4 // panel->FitInside(); return panel; } //---------------------------------------------------------------------------- void wxILPDwithImage::SelectedSerie() { if (_wxILPD->GetTypeOfSelection() == 3) { vector lstStringFileName; _wxILPD->GetLstImageFiles(&lstStringFileName); //EED 4 oct 2006 // marGdcmDicomILPD *margdcmdicomILPD = (marGdcmDicomILPD*)_mar->_dicom; // margdcmdicomILPD->SetListImages( &lstStringFileName ); if (_backStringFirstFile==*(lstStringFileName[0])) { //EED 14Avril2008 OJO // _noteBook->SetPageImage(1, 4); } else { //EED 14Avril2008 OJO // _noteBook->SetPageImage(1, 3); } // Show Image int i,sizeLstNameFiles=lstStringFileName.size(); i=sizeLstNameFiles/2; ShowDicomImage( lstStringFileName[i] ); // Show Number of Images _dicomPanelListView->InsertColumn(0, _T("Number of Images") , wxLIST_FORMAT_LEFT, 100); wxString text; text.Printf(_T("%d"),sizeLstNameFiles); SetItem(_dicomPanelListView,0,0, text ); } else { //EED 14Avril2008 OJO // _noteBook->SetPageImage(1, 5); } } //---------------------------------------------------------------------------- void wxILPDwithImage::ShowDicomInformation(string *fileImageName) { GDCM_NAME_SPACE::File *gdcmFile = GDCM_NAME_SPACE::File::New(); gdcmFile->SetLoadMode(GDCM_NAME_SPACE::LD_ALL); gdcmFile->SetFileName( fileImageName->c_str() ); bool ok = gdcmFile->Load(); // Filling lines if (gdcmFile->IsEmpty()==true) { _dicomPanelListView->InsertColumn(0, _T("Error") , wxLIST_FORMAT_LEFT, 80); SetItem(_dicomPanelListView,0,0, _T("File not found...") ); } else { // Creating Columns _dicomPanelListView->InsertColumn(0, _T("Tag") , wxLIST_FORMAT_LEFT, 80); _dicomPanelListView->InsertColumn(1, _T("VR") , wxLIST_FORMAT_LEFT, 40); _dicomPanelListView->InsertColumn(2, _T("Name") , wxLIST_FORMAT_LEFT, 150); _dicomPanelListView->InsertColumn(3, _T("Value") , wxLIST_FORMAT_LEFT, 400); int line=0; GDCM_NAME_SPACE::DataEntry *entry; entry = (GDCM_NAME_SPACE::DataEntry*)gdcmFile->GetFirstEntry(); while (entry!=NULL) { string groupelem = GDCM_NAME_SPACE::Util::Format("%04x | %04x" , entry->GetGroup() , entry->GetElement()); SetItem(_dicomPanelListView,line,0, wxString(groupelem.c_str(), wxConvUTF8) ); string vr =entry->GetVR().str(); SetItem(_dicomPanelListView,line,1, wxString(vr.c_str(), wxConvUTF8) ); SetItem(_dicomPanelListView,line,2, wxString(entry->GetName().c_str(), wxConvUTF8) ); if (entry->GetBinArea()) { // Print Value string value; if( vr == "US" || vr == "SS" || vr == "UL" || vr == "SL" || vr == "FL" || vr == "FD") { value = entry->GetString(); } else { value = GDCM_NAME_SPACE::Util::CreateCleanString( entry->GetBinArea(),entry->GetLength() ); } value = "[" + value + "]" ; SetItem(_dicomPanelListView,line,3, wxString(value.c_str(), wxConvUTF8) ); } else { SetItem(_dicomPanelListView,line,3, _T("- NOT LOADED -") ); } entry = (GDCM_NAME_SPACE::DataEntry*)gdcmFile->GetNextEntry(); line++; } // while } //IsEmpty gdcmFile->Delete(); } //---------------------------------------------------------------------------- void wxILPDwithImage::ShowDicomImage(string *fileImageName) { bool reconfigure=false; double colorwindow; double colorlevel; FILE *ff = fopen( fileImageName->c_str(),"r"); if (ff==NULL) { // string msgText= "File not found: \n\n"; // msgText.append(fileImageName->c_str()); // wxMessageDialog msgBox(this, msgText.c_str(),"Read file ERROR", wxOK ); // msgBox.ShowModal(); } else { fclose(ff); if (_wxvtk2Dbaseview!=NULL) { reconfigure=true; colorwindow = _wxvtk2Dbaseview->_imageViewer2XYZ->GetVtkImageViewer2()->GetColorWindow(); colorlevel = _wxvtk2Dbaseview->_imageViewer2XYZ->GetVtkImageViewer2()->GetColorLevel(); } // Read header file GDCM_NAME_SPACE::File *gdcmFile = GDCM_NAME_SPACE::File::New(); gdcmFile->SetLoadMode(GDCM_NAME_SPACE::LD_NOSHADOW); gdcmFile->SetFileName( fileImageName->c_str() ); bool ok = gdcmFile->Load(); long int offset = gdcmFile->GetPixelOffset(); int dim[3]; dim[0]=gdcmFile->GetXSize(); dim[1]=gdcmFile->GetYSize(); dim[2]=1; // Memory allocation vtkImageData *imageData = vtkImageData::New(); imageData->SetDimensions ( dim ); imageData->SetScalarTypeToUnsignedShort(); imageData->AllocateScalars(); imageData->Update(); marImageData *marimagedata = new marImageData(imageData); // Read Image marGdcmDicom margdcmdicom; void *p_vol = imageData->GetScalarPointer(0,0,0); margdcmdicom.loadFileDicom( p_vol , dim , (char *)fileImageName->c_str() ); // EED 17 Oct 2007 Before // if ( _wxvtk2Dbaseview ) { delete _wxvtk2Dbaseview; } // _wxvtk2Dbaseview = new wxVtk2DBaseView( _panelImage ); // EED 17 Oct 2007 After if ( _wxvtk2Dbaseview==NULL ) { _wxvtk2Dbaseview = new wxVtk2DBaseView( _panelImage ); wxVTKRenderWindowInteractor *imagePanel = _wxvtk2Dbaseview->GetWxVTKRenderWindowInteractor(); wxSizer *sizer=_panelImage->GetSizer(); sizer-> Add( imagePanel ,1,wxGROW ,0); _panelImage->SetAutoLayout(true); _panelImage->Layout(); } if ( _vtkbasedata ) { delete _vtkbasedata; } // if ( _widgetMesure ) { delete _widgetMesure; } //_widgetMesure = new wxWidgetMesure2D(_panelImage); //_wxvtk2Dbaseview = new wxVtk2DBaseView( _widgetMesure ); _vtkbasedata = new vtkBaseData(); _vtkbasedata->SetMarImageData( marimagedata ); _wxvtk2Dbaseview->SetVtkBaseData( _vtkbasedata ); _wxvtk2Dbaseview->Configure(true); //_widgetMesure->ConfigureA(_wxvtk2Dbaseview); //_widgetMesure -> SetMesureScale( gdcmFile->GetXSpacing() ); gdcmFile->Delete(); //sizer-> Add( _widgetMesure ,1,wxGROW ,0); _wxvtk2Dbaseview->Refresh(); if (reconfigure==true) { _wxvtk2Dbaseview->_imageViewer2XYZ->GetVtkImageViewer2()->SetColorWindow( colorwindow ); _wxvtk2Dbaseview->_imageViewer2XYZ->GetVtkImageViewer2()->SetColorLevel( colorlevel ); } } } //---------------------------------------------------------------------------- void wxILPDwithImage::ResetwxListView() { // Reset wxListView _dicomPanelListView->DeleteAllItems(); int i,size=_dicomPanelListView->GetColumnCount(); for (i=0;iDeleteColumn(0); } } //---------------------------------------------------------------------------- void wxILPDwithImage::SelectedImage() { if (_wxILPD->GetTypeOfSelection() == 4) { string fileImageName; _wxILPD->GetFileImageName( &fileImageName ); ShowDicomInformation( &fileImageName ); ShowDicomImage(&fileImageName); } } //---------------------------------------------------------------------------- void wxILPDwithImage::SelectedPatient() { if (_wxILPD->GetTypeOfSelection() == 1) { _dicomPanelListView->InsertColumn(0, _T("Number of Series") , wxLIST_FORMAT_LEFT, 80); int numberOfSeries = _wxILPD->GetNumberOfSeries(); wxString text; text.Printf(_T("%d"),numberOfSeries); SetItem(_dicomPanelListView,0,0, text ); } } //---------------------------------------------------------------------------- void wxILPDwithImage::OnSelectPatientStudySerieImage(wxCommandEvent& event) { ResetwxListView(); SelectedPatient(); SelectedSerie(); SelectedImage(); // Reset Image if there is no selection if ((_wxILPD->GetTypeOfSelection() == 4) || (_wxILPD->GetTypeOfSelection() == 3)) { } else { if (_vtkbasedata) { delete _vtkbasedata; _vtkbasedata=NULL; } if (_wxvtk2Dbaseview) { // delete _wxvtk2Dbaseview; // _wxvtk2Dbaseview=NULL; } } } //---------------------------------------------------------------------------- void wxILPDwithImage::SetItem( wxListView *wxlistview, int line, int col, wxString text ) { if (wxlistview->GetItemCount() <= line) { wxlistview->InsertItem(line,_T(" "),1); } wxListItem item; item.m_itemId = line; item.SetTextColour(*wxBLACK); item.SetFont(*wxNORMAL_FONT); // or wxNORMAL_FONT, wxSMALL_FONT, wxSWISS_FONT item.SetBackgroundColour(wxColour(255,255,255)); wxlistview->SetItem( item ); wxlistview->SetItem(line,col,text); } //---------------------------------------------------------------------------- wxILPD *wxILPDwithImage::GetWxILPD() { return _wxILPD; } //---------------------------------------------------------------------------- void wxILPDwithImage::Configure() { _pnlSplitter_ViewImage_wxILPD -> SetSashPosition(850); _pnlSplitter_Image_DicomList -> SetSashPosition(400); }