#include <vtkCamera.h>
#include <vtkRenderer.h>
-#include<wx/filefn.h>
+#include <wx/filefn.h>
+//#include <wx/tipwin.h>
using namespace crea;
PopUp_Settings = 501,
PopUp_About = 502,
PopUp_User = WxGimmick::UserMenuFirstId,
+ PopUp_SaveAs = 701,
+ PopUp_AddToFavorites = 702
};
//================================================================
- //================================================================
- class WxGimmickSettingsDialog : public wxDialog
- {
- public:
- WxGimmickSettingsDialog(wxWindow *parent);
- ~WxGimmickSettingsDialog();
-
-
- };
- //================================================================
-
-
// Image sizer
wxBoxSizer *isizer = new wxBoxSizer(wxHORIZONTAL );
mPanelImage->SetSizer( isizer );
-
+
+ // Notebook
+ mwxNotebook = new wxNotebook(mSplitter2,
+ -1,wxDefaultPosition, wxDefaultSize, 0);
+
+
+
// Fields view (bottom)
- mFieldsView = new WxGimmickFieldsView(mSplitter2,-1,
+ mFieldsView = new WxGimmickFieldsView(mwxNotebook,-1,
wxDefaultPosition,
wxDefaultSize,0);
GetSettings().BgColour(DicomNode::Series),
GetSettings().Colour(DicomNode::Image),
GetSettings().BgColour(DicomNode::Image));
+ mwxNotebook->AddPage( mFieldsView, _T("Dicom fields"));
-
-
+ // Help
+ mHelp = new WxGimmickHelp(mwxNotebook);
+ mwxNotebook->AddPage( mHelp, _T("Help"));
+
+ // Splitting
int wsize = size.GetWidth();
int hsize = size.GetHeight();
int previewhsize = 150;
int previewwsize = 400;
mSplitter2->SetMinimumPaneSize( previewhsize );
- mSplitter2->SplitHorizontally( mPanelImage, mFieldsView,
+ mSplitter2->SplitHorizontally( mPanelImage, mwxNotebook, //mFieldsView,
hsize - previewhsize);
rsizer->Add( mSplitter2,1,wxGROW ,0);
rpanel->Layout();
// previewer
- mInteractor = new wxVTKRenderWindowInteractor(mPanelImage,-1);
+ mInteractor = new crea::creawxVTKRenderWindowInteractor(mPanelImage,-1);
mInteractor->UseCaptureMouseOn();
mViewer = vtkImageViewer2::New();
ShowImage(mReader.GetImage(""));
+ // Show help if no collection
+ if (GetDicomDatabaseList().size()==0)
+ {
+ mwxNotebook->SetSelection(1);
+ }
+ else
+ {
+ mwxNotebook->SetSelection(0);
+ }
+ // mJustStarted = true;
}
//================================================================
boost::filesystem::change_extension(filepath,GetDatabaseExtension());
if ( boost::filesystem::exists(filepath) )
{
+ boost::filesystem::remove(filepath);
+ /*
+ LG : works on Linux but not Windows :
if ( ! boost::filesystem::remove(filepath) )
{
wxMessageBox(_T("Could not overwrite ")
_T("Error"),
wxOK,this);
return;
+
}
+ */
}
}
}
}
+ if (GetDicomDatabaseList().size()==0) mFieldsView->UpdateFields(db);
GetDicomDatabaseList().push_back(db);
UpdateDicomDatabaseView(db);
+
}
//================================================================
{
wxBusyCursor busy;
// std::cout << "WxGimmick : Reading config"<<std::endl;
+ LoadOrCreateFavoritesDatabase();
- // std::cout << "==> Loading collections from '"<<mDatabaseListFile
+ // std::cout <<
+ creaMessage("Gimmick!",1,"Gimmick! : ==> Loading collections from '"<<mDatabaseListFile<<"'"<<std::endl);
// <<"'"<<std::endl;
+
std::ifstream s;
s.open(mDatabaseListFile.c_str());
if (s.good())
}
else
{
- // std::cout << " ... ERROR !"<<std::endl;
+ creaMessage("Gimmick!",1," ==> ERROR opening collection '"<<tokens[0]<<"'"<<std::endl);
delete db;
}
}
}
else
{
- std::cout << "ERROR opening "<<mDatabaseListFile<<std::endl;
+ creaMessage("Gimmick!",1," ==> File does not exist. It will be created on exit (if you already ran Gimmick! and exited normally, this is not normal. Send a bug report).");
}
}
//================================================================
+ //================================================================
+ void WxGimmick::LoadOrCreateFavoritesDatabase()
+ {
+ // TODO
+ }
+ //================================================================
+
/*
//================================================================
void WxGimmick::OnClose(wxCloseEvent& event)
}
if (data->IsDicomNode())
{
- /*
+
// LG : BUGGY
+ /*
std::string str("&Remove ");
str += data->GetDicomNode()->GetTypeName();
menu.Append(PopUp_Remove, std2wx(str));
// Pop up menu callbacks
void WxGimmick::OnPopUpAbout(wxCommandEvent& event)
{
- wxMessageBox( _T("Give me my medical images quick ! \n\n (c) CREATIS-LRMN 2008\n"),
+ wxMessageBox( _T("Give me my medical images quick ! \n\n (c) CREATIS-LRMN 2008\n laurent.guigues@creatis.insa-lyon.fr"),
_T("Gimmick!"),
wxOK | wxICON_INFORMATION, this);
}
void WxGimmick::OnPopUpSettings(wxCommandEvent& event)
{
WxGimmickSettingsDialog* s =
- new WxGimmickSettingsDialog(this);
+ new WxGimmickSettingsDialog(this,&mSettings);
s->ShowModal();
delete s;
}
return false;
}
}
- std::cout << "Selecting : "<<node->ImageGetFullFileName() << std::endl;
+ // std::cout << "Selecting : "<<node->ImageGetFullFileName() << std::endl;
return true;
}
//================================================================
}
sib = GetTreeListCtrl()->GetNextSibling(sib);
}
- prio = maxprio + 1000;
+ prio = maxprio + 999;
sib = GetTreeListCtrl()->GetPrevSibling(item);
while (sib.IsOk())
{
void WxGimmick::ShowImage(vtkImageData* im)
{
// wxBusyCursor busy;
+ mViewer->SetInput( im );
+ mViewer->SetSlice( 0 );
+
int x1,x2,y1,y2,z1,z2;
double spx,spy,spz;
+ im->Update();
im->GetSpacing(spx,spy,spz);
im->GetExtent (x1,x2,y1,y2,z1,z2);
-
/*
+ std::cout << "-----------------------------"<<std::endl;
std::cout << x1 << "-"<<x2<<std::endl;
std::cout << y1 << "-"<<y2<<std::endl;
std::cout << z1 << "-"<<z2<<std::endl;
mspy = spy;
mspz = spz;
+ double *range = im->GetScalarRange();
+ mViewer->SetColorWindow(range[1] - range[0]);
+ mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
+
+ mViewer->GetRenderer()->ResetCamera();
+ double bounds[6];
+
+
+ mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
+
+ /*
+ std::cout <<"bounds : "<<bounds[0]<<","
+<<bounds[1]<<","
+<<bounds[2]<<","
+<<bounds[3]<<","
+<<bounds[4]<<","
+ <<bounds[5]<<std::endl;
+ */
+ mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
+ /*
vtkCamera *camera = mViewer->GetRenderer()->GetActiveCamera();
camera->SetViewUp ( spx*0, -spy*1, spz*0);
- camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, -spz*10000000);
+ camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*10000000);
camera->SetFocalPoint ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0);
camera->ComputeViewPlaneNormal();
camera->SetParallelScale( spx*(x2-x1)/2.0 );
+ camera->Roll ( 180 );
+ */
}
- mViewer->SetInput( im );
- mViewer->SetSlice( 0 );
mInteractor->Render();
}
//================================================================
void WxGimmick::OnInternalIdle()
{
ProcessImageEvents();
+ /*
+ if (mJustStarted)
+ {
+
+ mJustStarted = false;
+ }
+ */
+ //
}
//================================================================
{
// n2D to 3D
vtkImageData* out = vtkImageData::New();
- out->CopyStructure(first);
+ out->CopyStructure(first);
+ out->SetScalarType(first->GetScalarType());
int ext[6];
first->GetExtent(ext);
ext[5] = im.size();
out->SetExtent(ext);
+ // LG : TODO : Z Spacing ?
+ //
+ // ==> to get an accurate ZSpacing from a Dicom set of files
+ // ==> you need a gdcm::SerieHelper
+ // JPR
out->AllocateScalars();
- out->Print(std::cout);
+
+ //first->Print(std::cout);
+ // out->Print(std::cout);
int dim[3];
first->GetDimensions(dim);
( (unsigned long)first->GetScalarPointer(0,1,0)
- (unsigned long)first->GetScalarPointer(0,0,0))
*dim[1];
- std::cout << "imsize="<<imsize<<std::endl;
int slice = 0;
std::vector<DicomNode*>::iterator it;
for (it=im.begin(); it!=im.end(); ++it)
{
+ //std::cout << "copying slice "<<slice <<std::endl;
vtkImageData* cur = mReader.GetImage( (*it)->ImageGetFullFileName() );
void* src = cur->GetScalarPointer(0,0,0);
void* dst = out->GetScalarPointer(0,0,slice);
+ // std::cout << "src="<<src<<std::endl;
+ // std::cout << "dst="<<dst<<std::endl;
+ // std::cout << "siz="<<imsize<<std::endl;
memcpy(dst,src,imsize);
+
+ /*
+ // verif
+ int ii,jj;
+ for (ii=1;ii<4;ii++) {
+ for (jj=1;jj<4;jj++) {
+ int x = (int)(ii*dim[0] / 4);
+ int y = (int)(jj*dim[1] / 4);
+ std::cout << cur->GetScalarComponentAsFloat(x,y,0,0)
+ << " vs "
+ << out->GetScalarComponentAsFloat(x,y,slice,0)
+ << std::endl;
+ }
+ }
+ */
+
slice++;
}
f.push_back(out);
}
-
-
-
-
+ //====================================================================
+ void WxGimmick::ShowHelp()
+ {
+ /*
+ if (mHelpWindow==0)
+ {
+ mHelpWindow = new WxGimmickHelpWindow(this);
+ }
+ mHelpWindow->CenterOnParent();
+ mHelpWindow->ShowModal();
+ */
+ }
+ //====================================================================
- //================================================================
- //================================================================
- //================================================================
- //================================================================
-
- //================================================================
- WxGimmickSettingsDialog::WxGimmickSettingsDialog(wxWindow *parent)
- :
- wxDialog( parent,
- -1,
- _T("Settings"),
- wxDefaultPosition,
- wxSize(400,400),
- wxRESIZE_BORDER |
- wxSYSTEM_MENU |
- wxCLOSE_BOX |
- wxMAXIMIZE_BOX |
- wxMINIMIZE_BOX |
- wxCAPTION
- )
- {
- }
- //================================================================
-
- //================================================================
- WxGimmickSettingsDialog::~WxGimmickSettingsDialog()
- {
- }
- //================================================================
-
-
-
+