/*========================================================================= Program: wxMaracas Module: $RCSfile: wxMaracasDataBrowser.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 "wxMaracasFrame02.h" #include "wxMaracasDataBrowser.h" #include "marGdcmDicom.h" #include "gdcmDocument.h" #include "gdcmDicomDir.h" #include "gdcmDicomDirPatient.h" #include "gdcmDicomDirStudy.h" #include "gdcmDicomDirSerie.h" #include "gdcmDicomDirImage.h" #include "gdcmTS.h" //------------------------------------------------------------------------- class wxDlgDefineRegionZ : public wxDialog { public : wxDlgDefineRegionZ(wxWindow *parent,int maxSize, wxString title); int GetIniSlice(); int GetEndSlice(); void OnIni(wxScrollEvent& event); void OnEnd(wxScrollEvent& event); wxSlider *sldIni; wxSlider *sldEnd; private : }; //------------------------------------------------------------------------- //------------------------------------------------------------------------- //------------------------------------------------------------------------- wxDlgDefineRegionZ::wxDlgDefineRegionZ(wxWindow *parent,int maxSize, wxString title) : wxDialog(parent, -1, title){ sldIni = new wxSlider(this, -1, 0 , 0, maxSize, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS ); sldEnd = new wxSlider(this, -1, maxSize, 0, maxSize, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS ); wxStaticText *text1 = new wxStaticText(this, -1, _T("Start : ")); wxStaticText *text2 = new wxStaticText(this, -1, _T("End : ")); wxButton *btnOk = new wxButton(this, wxID_OK , _T("OK")); wxButton *btnCancel = new wxButton(this, wxID_CANCEL , _T("CANCEL")); sldIni->SetSize(300,20); sldEnd->SetSize(300,20); wxFlexGridSizer *sizer = new wxFlexGridSizer(2); sizer->Add(text1); sizer->Add(sldIni); sizer->Add(text2); sizer->Add(sldEnd); sizer->Add(btnOk); sizer->Add(btnCancel); this->SetSizer(sizer); this->SetSize(450,200); this->Connect(sldIni->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxDlgDefineRegionZ::OnIni ); this->Connect(sldEnd->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxDlgDefineRegionZ::OnEnd ); } //------------------------------------------------------------------------- int wxDlgDefineRegionZ::GetIniSlice(){ return sldIni->GetValue(); } //------------------------------------------------------------------------- int wxDlgDefineRegionZ::GetEndSlice(){ return sldEnd->GetValue(); } //------------------------------------------------------------------------- void wxDlgDefineRegionZ::OnIni(wxScrollEvent& event){ if (sldIni->GetValue() > sldEnd->GetValue() ){ sldEnd->SetValue(sldIni->GetValue() ); } } //------------------------------------------------------------------------- void wxDlgDefineRegionZ::OnEnd(wxScrollEvent& event){ if (sldIni->GetValue() > sldEnd->GetValue() ){ sldIni->SetValue(sldEnd->GetValue() ); } } //------------------------------------------------------------------------- //------------------------------------------------------------------------- //------------------------------------------------------------------------- BEGIN_EVENT_TABLE( wxMaracasDataBrowser, wxPanel ) EVT_BUTTON( ID_BUTTON_CHANGEDIR , wxMaracasDataBrowser::OnChangeDir ) EVT_BUTTON( ID_BUTTON_CHANGEDICOMFILE , wxMaracasDataBrowser::OnChangeDicomFile ) EVT_BUTTON( ID_BUTTON_CREATEDICOMFILE , wxMaracasDataBrowser::OnCreateDicomFile ) EVT_LIST_ITEM_SELECTED( ID_STUDIES_LIST, wxMaracasDataBrowser::OnStudySelected ) EVT_LIST_ITEM_SELECTED( ID_SERIES_LIST , wxMaracasDataBrowser::OnSerieSelected ) EVT_LIST_ITEM_ACTIVATED( ID_SERIES_LIST , wxMaracasDataBrowser::OnActivated ) END_EVENT_TABLE( ); //------------------------------------------------------------------------- wxMaracasDataBrowser::wxMaracasDataBrowser( wxFrame* parent, marInterface* mar, wxWindowID id ) : wxPanel( parent, id, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ) { _mar = mar; frame_parent = parent; _splitter = new wxSplitterWindow( this, -1, wxDefaultPosition, wxSize( 1200, 800 ), wxSP_3D ); _studies = new wxListCtrl( _splitter, ID_STUDIES_LIST, wxDefaultPosition, wxSize(100,100), wxLC_REPORT ); _studies->InsertColumn( 0, _T("Patient's name" )); _studies->InsertColumn( 1, _T("Patient's ID" )); _studies->InsertColumn( 2, _T("Study's name" )); _studies->InsertColumn( 3, _T("Study's ID" )); _studies->InsertColumn( 4, _T("Study's date" )); _studies->InsertColumn( 5, _T("Study's time" )); _studies->InsertColumn( 6, _T("Study's description" )); _series = new wxListCtrl( _splitter, ID_SERIES_LIST, wxDefaultPosition, wxSize(100,100), wxLC_REPORT ); _series->InsertColumn( 0, _T("Serie's name" )); _series->InsertColumn( 1, _T("Serie's ID" )); _series->InsertColumn( 2, _T("Serie's date" )); _series->InsertColumn( 3, _T("Serie's time" )); _series->InsertColumn( 4, _T("Modality" )); _series->InsertColumn( 5, _T("Body part examined" )); _series->InsertColumn( 6, _T("Serie's description" )); _series->InsertColumn( 7, _T("Serie's diagnostic" )); _series->InsertColumn( 8, _T("Institution name" )); _series->InsertColumn( 9, _T("Number of images" )); _splitter->SplitHorizontally( _studies, _series); wxFlexGridSizer *szTop = new wxFlexGridSizer( 1 ); wxButton *btnChangeDir = new wxButton(this,ID_BUTTON_CHANGEDIR,_T("Change Directory")) ; wxButton *btnChangeDicomFile = new wxButton(this,ID_BUTTON_CHANGEDICOMFILE,_T("Change DICOMDIR file")) ; wxButton *btnCreateDicomFile = new wxButton(this,ID_BUTTON_CREATEDICOMFILE,_T("Create DICOMDIR file")) ; btnChangeDir->SetSize(150,25); btnChangeDicomFile->SetSize(150,25); btnCreateDicomFile->SetSize(150,25); szTop->Add( btnChangeDicomFile , 0 , wxALL, 10); szTop->Add( btnCreateDicomFile , 0 , wxALL, 10); szTop->Add( btnChangeDir , 0 , wxALL, 10); wxFlexGridSizer *szVertical = new wxFlexGridSizer( 2 ); szVertical->Add( szTop, 1, wxALL|wxEXPAND , 0 ); szVertical->Add( _splitter, 1, wxALL|wxEXPAND , 0 ); this->SetSizer( szVertical ); this->SetAutoLayout( true ); this->Layout(); szTop->Fit( this ); szTop->SetSizeHints( this ); // _splitter->SetMinimumPaneSize( 50 ); _splitter->SetSashPosition(500,true); _parseDir=false; } //---------------------------------------------------------------------------- void wxMaracasDataBrowser::CreateDicomFile(){ marGdcmDicom *gdcmDicom = (marGdcmDicom*)_mar->_dicom; wxBusyCursor wait; gdcmDicom->CreateDicomFile(); } //------------------------------------------------------------------------- void wxMaracasDataBrowser::LoadData( ){ wxBusyCursor wait; long tmp; int it = 0; _studies->Hide( ); _series->Hide( ); _studies->DeleteAllItems( ); _series->DeleteAllItems( ); marGdcmDicom *gdcmDicom = (marGdcmDicom*)_mar->_dicom; gdcmDicom->FillDicomInfo(_parseDir); GDCM_NAME_SPACE::DicomDir *dicomDir = gdcmDicom->getGdcmDicomDir(); GDCM_NAME_SPACE::DicomDirPatient *pa; GDCM_NAME_SPACE::DicomDirStudy *st; pa = dicomDir->GetFirstPatient(); while (pa){ // on degouline les PATIENT de ce DICOMDIR st = pa->GetFirstStudy(); while ( st ) { // on degouline les STUDY de ce patient tmp = _studies->InsertItem( it, wxString(pa->GetEntryString (0x0010, 0x0010).c_str(), wxConvUTF8) , 0 ); // Patient's Name _studies->SetItemData( tmp, it ); _studies->SetItem( it, 1, wxString(pa->GetEntryString (0x0010, 0x0020).c_str(), wxConvUTF8) ); // ID_Patient_ID _studies->SetItem( it, 2, wxString(st->GetEntryString (0x0020, 0x000d).c_str(), wxConvUTF8) ); // ID_Study_Instance_UID _studies->SetItem( it, 3, wxString(st->GetEntryString (0x0020, 0x0010).c_str(), wxConvUTF8) ); // ID_Study_ID _studies->SetItem( it, 4, wxString(st->GetEntryString (0x0008, 0x0020).c_str(), wxConvUTF8) ); // ID_Study_Date _studies->SetItem( it, 5, wxString(st->GetEntryString (0x0008, 0x0030).c_str(), wxConvUTF8) ); // ID_Study_Time _studies->SetItem( it, 6, wxString(st->GetEntryString (0x0008, 0x1030).c_str(), wxConvUTF8) ); // ID_Study_Description it++; st = pa->GetNextStudy(); } pa = dicomDir->GetNextPatient(); } _studies->Show( ); _series->Show( ); } //---------------------------------------------------------------------------- void wxMaracasDataBrowser::LoadDicomData(int type, wxString msg){ wxString dirHome = _mar->_parameters->getStringParam( marParameters::e_dicom_images_directory ); wxDirDialog dialog( this, msg, ( !dirHome.IsEmpty( ) )? dirHome: wxGetHomeDir( ) ); if( dialog.ShowModal( ) == wxID_OK ){ _mar->_parameters->setStringParam( marParameters::e_dicom_images_directory, dialog.GetPath( ) ); _mar->saveParameters( ); if (type==1){ _parseDir=true; this->LoadData(); } if (type==2){ _parseDir=false; this->LoadData(); } if (type==3){ this->CreateDicomFile(); _parseDir=false; this->LoadData(); } } } //---------------------------------------------------------------------------- void wxMaracasDataBrowser::OnChangeDir( wxCommandEvent& event ){ this->LoadDicomData(1,_T("Choose a directory...")); } //---------------------------------------------------------------------------- void wxMaracasDataBrowser::OnChangeDicomFile( wxCommandEvent& event ){ this->LoadDicomData(2,_T("Choose a DICOM directory...")); } //---------------------------------------------------------------------------- void wxMaracasDataBrowser::OnCreateDicomFile( wxCommandEvent& event ){ this->LoadDicomData(3,_T("Create a DICOM file. Choose a directory...")); } //------------------------------------------------------------------------- void wxMaracasDataBrowser::OnStudySelected( wxListEvent& event ){ int it=0; int maxCount=event.GetIndex(); marGdcmDicom *gdcmDicom = (marGdcmDicom*)_mar->_dicom; GDCM_NAME_SPACE::DicomDir *dicomDir = gdcmDicom->getGdcmDicomDir(); GDCM_NAME_SPACE::DicomDirPatient *pa; GDCM_NAME_SPACE::DicomDirStudy *st; GDCM_NAME_SPACE::DicomDirSerie *se; GDCM_NAME_SPACE::DicomDirImage *im; bool ok=true; pa = dicomDir->GetFirstPatient(); while ((pa) && (ok==true)){ // on degouline les PATIENT de ce DICOMDIR st = pa->GetFirstStudy(); while ((st) && (ok==true)) { // on degouline les STUDY de ce patient if (it==maxCount) { gdcmDicom->setActualPatient( pa ); gdcmDicom->setActualStudy( st ); ok=false; } it++; if (ok==true) { st = pa->GetNextStudy(); } } pa = dicomDir->GetNextPatient(); } _series->DeleteAllItems( ); long tmp; it=0; se = st->GetFirstSerie(); while ( se ) { // on degouline les SERIES de cette study tmp = _series->InsertItem( it, wxString(se->GetEntryString(0x0020, 0x000e).c_str(), wxConvUTF8) , 0 ); // ID_Series_Instance_UID _series->SetItemData( tmp, it ); _series->SetItem( it, 1, wxString(se->GetEntryString(0x0020, 0x0011).c_str(), wxConvUTF8 )); // ID_Series_Number _series->SetItem( it, 2, wxString(se->GetEntryString(0x0008, 0x0021).c_str(), wxConvUTF8 )); // ID_Series_Date _series->SetItem( it, 3, wxString(se->GetEntryString(0x0008, 0x0031).c_str(), wxConvUTF8 )); // ID_Series_Time _series->SetItem( it, 4, wxString(se->GetEntryString(0x0008, 0x0060).c_str(), wxConvUTF8 )); // ID_Modality _series->SetItem( it, 5, wxString(se->GetEntryString(0x0018, 0x0015).c_str(), wxConvUTF8 )); // ID_Body_Part_Examined _series->SetItem( it, 6, wxString(se->GetEntryString(0x0008, 0x103e).c_str(), wxConvUTF8 )); // ID_Series_Description // _series->SetItem( it, 7, wxString(se->GetEntryString(0x0008, 0x1080).c_str(), wxConvUTF8 )); // ID_Admitting_Diagnoses_Description // _series->SetItem( it, 8, wxString(se->GetEntryString(0x0008, 0x0080).c_str(), wxConvUTF8 )); // ID_Institution_Name int numOfImg = 0; im = se->GetFirstImage(); while ( im ) { // on degouline les Images de cette serie numOfImg++; im = se->GetNextImage(); } wxString strNumOfImg; strNumOfImg.sprintf(_T("%d"),numOfImg); _series->SetItem( it, 9, strNumOfImg ); // number of images in the serie it++; se = st->GetNextSerie(); } //re-disable frame_parent->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER, false); } //------------------------------------------------------------------------- void wxMaracasDataBrowser::OnSerieSelected( wxListEvent& event ){ marGdcmDicom *gdcmDicom = (marGdcmDicom*)_mar->_dicom; GDCM_NAME_SPACE::DicomDirStudy *st = gdcmDicom->getActualStudy(); GDCM_NAME_SPACE::DicomDirSerie *se; int it = 0; int maxCount = event.GetIndex(); se = st->GetFirstSerie(); bool ok=true; while ( (se) && (ok==true) ) { // on degouline les SERIES de cette study if (it==maxCount){ gdcmDicom->setActualSerie( se ); ok=false; } it++; se = st->GetNextSerie(); } frame_parent->GetToolBar()->EnableTool(ID_TOOLBAR_IMAGE_BROWSER, true); } //------------------------------------------------------------------------- void wxMaracasDataBrowser::OnActivated( wxListEvent& event ) { bool ok=false; marGdcmDicom *gdcmDicom = (marGdcmDicom*)_mar->_dicom; GDCM_NAME_SPACE::DicomDirSerie *se; GDCM_NAME_SPACE::DicomDirImage *im; int numOfImg = 0; se = gdcmDicom->getActualSerie(); im = se->GetFirstImage(); while ( im ) { // on degouline les Images de cette serie numOfImg++; im = se->GetNextImage(); } wxDlgDefineRegionZ *wxdlgdefineregionZ = new wxDlgDefineRegionZ(this,numOfImg, _T("Define Z region")); if (wxdlgdefineregionZ->ShowModal() == wxID_OK ){ gdcmDicom->setIniSlice( wxdlgdefineregionZ->GetIniSlice() ); gdcmDicom->setEndSlice( wxdlgdefineregionZ->GetEndSlice() ); ok=true; } wxdlgdefineregionZ->Destroy(); if (ok==true){ wxCommandEvent _evt( wxEVT_COMMAND_MENU_SELECTED ,ID_TOOLBAR_IMAGE_BROWSER ); ProcessEvent(_evt); } } // EOF - wxDataBrowser.cxx