1 /*=========================================================================
4 Module: $RCSfile: wxManualRegistration3D.cxx,v $
6 Date: $Date: 2008/10/31 16:32:42 $
7 Version: $Revision: 1.1 $
9 Copyright: (c) 2002, 2003
12 This software is distributed WITHOUT ANY WARRANTY; without even
13 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 PURPOSE. See the above copyright notice for more information.
16 =========================================================================*/
21 #include <wx/splitter.h>
22 #include <wx/notebook.h>
23 #include <wx/colordlg.h>
25 #include "wxManualRegistration3D.h"
28 //-------------------------------------------------------------------
29 //-------------------------------------------------------------------
30 //-------------------------------------------------------------------
32 BEGIN_EVENT_TABLE( wxManualRegistration3D, wxPanel )
33 EVT_MENU( 12121, wxManualRegistration3D::OnRefreshView )
34 // EVT_MENU( 12122, wxManualTree_MPRWidget::OnDClickLeft )
38 wxManualRegistration3D::wxManualRegistration3D( wxWindow* parent,
39 marImageData *marimageData )
40 : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
43 _marimageData = marimageData;
45 _vtkmprbasedata_A = new vtkMPRBaseData();
46 _vtkmprbasedata_A->SetMarImageData(_marimageData);
48 _wxvtk3Dbaseview_Clipping3D = NULL;
49 _wxvtkmpr3Dview_A = NULL;
50 _wxvtkclipping3Dview_A = NULL;
52 _wxvtkmpr3Dview_B = NULL;
53 _wxvtkclipping3Dview_B = NULL;
57 wxSplitterWindow *pnlSplitter = new wxSplitterWindow( this , -1);
62 wxPanel * view3Dpanel = Create3DView( pnlSplitter , _vtkmprbasedata_A );
63 wxPanel * registrationControl = CreateRegistration3DControl( pnlSplitter ,_vtkmprbasedata_A);
65 // this->GetSize(&ww,&hh);
67 pnlSplitter -> SplitVertically( view3Dpanel, registrationControl , 700);
68 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL );
69 sizer -> Add( pnlSplitter ,1,wxGROW ,0);
70 pnlSplitter -> SetMinimumPaneSize( 25 );
71 this -> SetSizer(sizer);
74 _transform = vtkTransform::New();
75 _transformBak = vtkTransform::New();
76 _transformBak->Identity();
82 //----------------------------------------------------------------------------
84 wxManualRegistration3D::~wxManualRegistration3D( )
86 if (_wxvtk3Dbaseview_Clipping3D != NULL) { delete _wxvtk3Dbaseview_Clipping3D; }
87 if (_wxvtkmpr3Dview_A != NULL) { delete _wxvtkmpr3Dview_A; }
88 if (_wxvtkclipping3Dview_A != NULL) { delete _wxvtkclipping3Dview_A; }
90 if (_wxvtkmpr3Dview_B != NULL) { delete _wxvtkmpr3Dview_B; }
91 if (_wxvtkclipping3Dview_B != NULL) { delete _wxvtkclipping3Dview_B; }
96 //----------------------------------------------------------------------------
97 void wxManualRegistration3D::ConfigureVTK()
99 _wxvtk3Dbaseview_Clipping3D -> Configure();
101 _wxvtkmpr3Dview_A -> Configure();
102 _wxvtkclipping3Dview_A -> Configure();
103 vtkInteractorStyle3DView *vtkinteractorstyle3Dview_A = new vtkInteractorStyle3DView();
104 vtkinteractorstyle3Dview_A->SetWxVtkMPR3DView(_wxvtkmpr3Dview_A);
105 vtkinteractorstyle3Dview_A->SetWxVtkClipping3DView(_wxvtkclipping3Dview_A);
106 _wxvtk3Dbaseview_Clipping3D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview_A );
110 //----------------------------------------------------------------------------
111 void wxManualRegistration3D::ConfigureVTK_B()
113 _wxvtkmpr3Dview_B -> Configure();
114 _wxvtkclipping3Dview_B -> Configure();
115 vtkInteractorStyle3DView *vtkinteractorstyle3Dview_B = new vtkInteractorStyle3DView();
116 vtkinteractorstyle3Dview_B->SetWxVtkMPR3DView(_wxvtkmpr3Dview_B);
117 vtkinteractorstyle3Dview_B->SetWxVtkClipping3DView(_wxvtkclipping3Dview_B);
118 _wxvtk3Dbaseview_Clipping3D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( vtkinteractorstyle3Dview_B );
121 //----------------------------------------------------------------------------
122 void wxManualRegistration3D::OnRefreshView(wxCommandEvent & event)
127 //----------------------------------------------------------------------------
128 void wxManualRegistration3D::OnTracking(wxCommandEvent& event)
130 if (_wxvtkmpr3Dview_B!=NULL){
131 _wxvtkmpr3Dview_B->InitOrientationPointWidget();
135 this->_marimageData->GetImageData()->GetSpacing(spc); //image t=0
138 xBak = spc[0] * this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX();
139 yBak = spc[1] * this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY();
140 zBak = spc[2] * this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ();
143 mat[0]=_transform->GetMatrix()->GetElement(0,0);
144 mat[1]=_transform->GetMatrix()->GetElement(0,1);
145 mat[2]=_transform->GetMatrix()->GetElement(0,2);
146 mat[3]=_transform->GetMatrix()->GetElement(0,3);
148 mat[4]=_transform->GetMatrix()->GetElement(1,0);
149 mat[5]=_transform->GetMatrix()->GetElement(1,1);
150 mat[6]=_transform->GetMatrix()->GetElement(1,2);
151 mat[7]=_transform->GetMatrix()->GetElement(1,3);
153 mat[8]=_transform->GetMatrix()->GetElement(2,0);
154 mat[9]=_transform->GetMatrix()->GetElement(2,1);
155 mat[10]=_transform->GetMatrix()->GetElement(2,2);
156 mat[11]=_transform->GetMatrix()->GetElement(2,3);
158 mat[12]=_transform->GetMatrix()->GetElement(3,0);
159 mat[13]=_transform->GetMatrix()->GetElement(3,1);
160 mat[14]=_transform->GetMatrix()->GetElement(3,2);
161 mat[15]=_transform->GetMatrix()->GetElement(3,3);
163 _transformBak->SetMatrix(mat);
166 // EED 25 Janvier 2005 TestLoic
167 this->_wxvtkmpr3Dview_A->TestLoic1();
173 //----------------------------------------------------------------------------
174 void wxManualRegistration3D::RefreshView()
178 if ( _wxvtkmpr3Dview_B!=NULL )
180 if (_btnTrack->GetValue()==true)
183 this->_marimageData->GetImageData()->GetSpacing(spc); // image t=0
184 vtkTransform *m = this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetTransformOrientation();
185 double x = spc[0] * this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetX();
186 double y = spc[1] * this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetY();
187 double z = spc[2] * this->_wxvtkmpr3Dview_B->GetVtkMPR3DDataViewer()->GetVtkMPRBaseData()->GetZ();
188 double xx=this->_posX->GetValue()/30.0;
189 double yy=this->_posY->GetValue()/30.0;
190 double zz=this->_posZ->GetValue()/30.0;
191 double sx=this->_scaleX->GetValue()/100.0;
192 double sy=this->_scaleY->GetValue()/100.0;
193 double sz=this->_scaleZ->GetValue()/100.0;
194 _transform->Identity();
195 // _transform->Translate(x,y,z);
199 // _transform->Translate((x-xBak),(y-yBak),(z-zBak) );
200 // _transform->Translate( xBak , yBak , zBak );
201 _transform->Translate( xx , yy , zz );
202 _transform->Translate( x , y , z );
203 _transform->Concatenate( m->GetMatrix() );
204 _transform->RotateX( _angAlfa->GetValue()/30.0 );
205 _transform->RotateY( _angBeta->GetValue()/30.0 );
206 _transform->RotateZ( _angGama->GetValue()/30.0 );
207 _transform->Scale( sx,sy,sz );
208 _transform->Translate(-(xBak),-(yBak),-(zBak) );
210 _transform->Concatenate( _transformBak->GetMatrix() );
216 vtkClipping3DDataViewer *vtkclipping3Ddataviewer = _wxvtkclipping3Dview_B->GetVtkClipping3DDataViewer();
221 vtkactor = vtkclipping3Ddataviewer->GetTissueActor(i);
222 vtkactor->SetUserTransform( _transform );
224 _wxvtkmpr3Dview_B -> RefreshView();
225 _wxvtkclipping3Dview_B -> Refresh();
228 _wxvtkmpr3Dview_A -> RefreshView();
229 _wxvtkclipping3Dview_A -> Refresh();
230 _wxvtk3Dbaseview_Clipping3D -> Refresh();
232 if (_panelCutting!=NULL)
234 _panelCutting->RefreshView();
241 //----------------------------------------------------------------------------
242 wxPanel* wxManualRegistration3D::CreateRegistration3DControl( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
244 wxPanel *panel = new wxPanel(parent,-1);
246 int maxX = vtkmprbasedata->GetMaxPositionX();
247 int maxY = vtkmprbasedata->GetMaxPositionY();
248 int maxZ = vtkmprbasedata->GetMaxPositionZ();
253 _posX = new wxSlider( panel, -1,0 , -maxX*2, maxX*2, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS |wxSL_LABELS );
254 _posY = new wxSlider( panel, -1,0 , -maxY*2, maxY*2, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS |wxSL_LABELS );
255 _posZ = new wxSlider( panel, -1,0 , -maxZ*2, maxZ*2, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS |wxSL_LABELS );
257 _scaleX = new wxSlider( panel, -1,100 , 0, 200, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS |wxSL_LABELS );
258 _scaleY = new wxSlider( panel, -1,100 , 0, 200, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS |wxSL_LABELS );
259 _scaleZ = new wxSlider( panel, -1,100 , 0, 200, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS |wxSL_LABELS );
262 _angAlfa = new wxSlider( panel, -1,0 , -100, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS |wxSL_LABELS );
263 _angBeta = new wxSlider( panel, -1,0 , -100, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS |wxSL_LABELS );
264 _angGama = new wxSlider( panel, -1,0 , -100, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_AUTOTICKS |wxSL_LABELS );
267 _btnTrack = new wxCheckBox(panel, -1,_T("Tracking"));
269 _posX->SetTickFreq( 10, 0 );
270 _posY->SetTickFreq( 10, 0 );
271 _posZ->SetTickFreq( 10, 0 );
273 _angAlfa->SetTickFreq( 30, 0 );
274 _angBeta->SetTickFreq( 30, 0 );
275 _angGama->SetTickFreq( 30, 0 );
280 Connect(_posX->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation );
281 Connect(_posY->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation );
282 Connect(_posZ->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation );
284 Connect(_scaleX->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation );
285 Connect(_scaleY->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation );
286 Connect(_scaleZ->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation );
288 Connect(_angAlfa->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation );
289 Connect(_angBeta->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation );
290 Connect(_angGama->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &wxManualRegistration3D::OnPositionRotation );
292 Connect(_btnTrack->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &wxManualRegistration3D::OnTracking );
295 wxBoxSizer *sizerH1 = new wxBoxSizer(wxHORIZONTAL);
296 sizerH1->Add( _posX, 1, wxALL|wxEXPAND, 5);
297 sizerH1->Add( _posY, 1, wxALL|wxEXPAND, 5);
298 sizerH1->Add( _posZ, 1, wxALL|wxEXPAND, 5);
301 wxBoxSizer *sizerH2 = new wxBoxSizer(wxHORIZONTAL);
302 sizerH2->Add( _scaleX, 1, wxALL|wxEXPAND, 5);
303 sizerH2->Add( _scaleY, 1, wxALL|wxEXPAND, 5);
304 sizerH2->Add( _scaleZ, 1, wxALL|wxEXPAND, 5);
306 wxBoxSizer *sizerH3 = new wxBoxSizer(wxHORIZONTAL);
307 sizerH3->Add( _angAlfa, 1, wxALL|wxEXPAND, 5);
308 sizerH3->Add( _angBeta, 1, wxALL|wxEXPAND, 5);
309 sizerH3->Add( _angGama, 1, wxALL|wxEXPAND, 5);
312 wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
313 sizer->Add( sizerH1 , 1, wxALL|wxEXPAND, 0);
314 sizer->Add( sizerH2 , 1, wxALL|wxEXPAND, 0);
315 sizer->Add( sizerH3 , 1, wxALL|wxEXPAND, 0);
316 sizer->Add( _btnTrack , 1, wxALL|wxEXPAND, 10);
317 sizer->Add( new wxPanel(panel,-1) , 1, wxALL|wxEXPAND, 0);
318 sizer->Add( new wxPanel(panel,-1) , 1, wxALL|wxEXPAND, 0);
319 sizer->Add( new wxPanel(panel,-1) , 1, wxALL|wxEXPAND, 0);
321 panel->SetAutoLayout(true);
322 panel->SetSizer(sizer);
323 panel->SetSize(400,400);
328 //----------------------------------------------------------------------------
329 void wxManualRegistration3D::OnPositionRotation(wxScrollEvent& event)
335 //----------------------------------------------------------------------------
336 wxPanel* wxManualRegistration3D::Create3DView( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata)
339 wxPanel *panel=new wxPanel(parent,-1);
341 wxSplitterWindow *panelClipping3D = new wxSplitterWindow( panel , -1);
342 _wxvtk3Dbaseview_Clipping3D = new wxVtk3DBaseView( panelClipping3D );
344 _wxvtkclipping3Dview_A = new wxVtkClipping3DView(_wxvtk3Dbaseview_Clipping3D);
345 vtkClipping3DDataViewer *vtkclipping3Ddataviewer_A = new vtkClipping3DDataViewer();
346 vtkclipping3Ddataviewer_A->SetVtkMPRBaseData(vtkmprbasedata);
347 vtkclipping3Ddataviewer_A->Configure();
348 _wxvtkclipping3Dview_A->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer_A);
350 _wxvtkmpr3Dview_A = new wxVtkMPR3DView( _wxvtk3Dbaseview_Clipping3D );
351 vtkMPR3DDataViewer *vtkmpr3Ddataviewer_A = new vtkMPR3DDataViewer();
352 vtkmpr3Ddataviewer_A->SetVtkMPRBaseData(vtkmprbasedata);
353 vtkmpr3Ddataviewer_A->Configure();
354 _wxvtkmpr3Dview_A->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer_A);
358 wxWindow *window3D = _wxvtk3Dbaseview_Clipping3D->GetWxVTKRenderWindowInteractor();
359 wxSplitterWindow *panelControlSplit = new wxSplitterWindow(panelClipping3D,-1);
362 wxPanel *panelControl_A = new wxPanel(panelControlSplit,-1,wxDefaultPosition,wxSize(800,800));
364 wxPanel *controlPanelMPR3D_A = _wxvtkmpr3Dview_A->CreateControlPanel(panelControl_A);
365 wxPanel *controlPanelClipping3D_A = _wxvtkclipping3Dview_A->CreateControlPanel(panelControl_A);
367 _btnCutImageData = new wxCheckBox(panelControl_A,-1,_T("Cut Module"));
368 Connect(_btnCutImageData->GetId() , wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &wxManualRegistration3D::OnCutImagaData );
371 // wxBoxSizer *sizerCtrol_A = new wxBoxSizer(wxVERTICAL);
372 wxFlexGridSizer *sizerCtrol_A = new wxFlexGridSizer(1);
374 sizerCtrol_A->Add(controlPanelMPR3D_A , 1, wxALL|wxEXPAND, 2);
375 sizerCtrol_A->Add(controlPanelClipping3D_A , 1, wxALL|wxEXPAND, 2);
376 sizerCtrol_A->Add( _btnCutImageData , 1, wxALL, 2);
379 panelControl_A->SetAutoLayout(true);
380 panelControl_A->SetSizer(sizerCtrol_A);
381 panelControl_A->SetSize(400,350);
382 panelControl_A->Layout();
386 _panelControl_B = new wxPanel(panelControlSplit,-1,wxDefaultPosition,wxSize(800,800));
389 panelControlSplit->SplitVertically(panelControl_A, _panelControl_B);
390 panelControlSplit->SetMinimumPaneSize( 20 );
392 wxBoxSizer *sizerCtrol = new wxBoxSizer(wxHORIZONTAL);
393 sizerCtrol->Add(panelControlSplit , 1, wxALL|wxEXPAND, 2);
395 panelControlSplit->SetAutoLayout(true);
396 panelControlSplit->SetSizer(sizerCtrol);
397 // panelControlSplit->SetSize(400,350);
398 panelControlSplit->Layout();
402 while (pp->GetParent()!=NULL) pp=pp->GetParent();
403 pp->GetSize(&ww,&hh);
406 // panelClipping3D -> SetMinimumPaneSize( -50 );
407 panelClipping3D -> SplitHorizontally( panelControlSplit,window3D/*, (int)(hh*0.20)*/ );
408 panelClipping3D -> SetMinimumPaneSize( 20 );
409 wxwindow=panelClipping3D;
411 wxBoxSizer *sizerH1 = new wxBoxSizer(wxHORIZONTAL);
412 sizerH1->Add(wxwindow , 1, wxALL|wxEXPAND, 0);
413 panel->SetAutoLayout(true);
414 panel->SetSizer(sizerH1);
415 panel->SetSize(400,400);
419 // panel->FitInside();
424 //--------------------------------------------------------------------------
425 void wxManualRegistration3D::AddPanelControl_B( wxWindow *parent, marImageData *marimagedata)
428 // _imageData_B=marimagedata->GetImageData();
430 vtkMPRBaseData* vtkmprbasedata = new vtkMPRBaseData();
431 vtkmprbasedata->SetMarImageData(marimagedata);
433 _wxvtkclipping3Dview_B = new wxVtkClipping3DView(_wxvtk3Dbaseview_Clipping3D);
434 vtkClipping3DDataViewer *vtkclipping3Ddataviewer_B = new vtkClipping3DDataViewer();
435 vtkclipping3Ddataviewer_B->SetVtkMPRBaseData(vtkmprbasedata);
436 vtkclipping3Ddataviewer_B->Configure();
437 _wxvtkclipping3Dview_B->SetVtkClipping3DDataViewer(vtkclipping3Ddataviewer_B);
439 _wxvtkmpr3Dview_B = new wxVtkMPR3DView( _wxvtk3Dbaseview_Clipping3D );
440 vtkMPR3DDataViewer *vtkmpr3Ddataviewer_B = new vtkMPR3DDataViewer();
441 vtkmpr3Ddataviewer_B->SetVtkMPRBaseData(vtkmprbasedata);
442 vtkmpr3Ddataviewer_B->Configure();
443 _wxvtkmpr3Dview_B->SetVtkMPR3DDataViewer(vtkmpr3Ddataviewer_B);
446 wxPanel *controlPanelMPR3D_B = _wxvtkmpr3Dview_B->CreateControlPanel(_panelControl_B);
447 wxPanel *controlPanelClipping3D_B = _wxvtkclipping3Dview_B->CreateControlPanel(_panelControl_B);
449 // wxBoxSizer *sizerCtrol_B = new wxBoxSizer(wxVERTICAL);
450 wxFlexGridSizer *sizerCtrol_B = new wxFlexGridSizer(1);
452 sizerCtrol_B->Add(controlPanelMPR3D_B , 1, wxALL|wxEXPAND, 2);
453 sizerCtrol_B->Add(controlPanelClipping3D_B , 1, wxALL|wxEXPAND, 2);
455 _panelControl_B->SetAutoLayout(true);
456 _panelControl_B->SetSizer(sizerCtrol_B);
457 _panelControl_B->SetSize(400,350);
458 _panelControl_B->Layout();
461 //--------------------------------------------------------------------------
462 void wxManualRegistration3D::AddSecondVolume(marImageData *marimagedata)
464 AddPanelControl_B(_panelControl_B,marimagedata);
468 //--------------------------------------------------------------------------
469 bool wxManualRegistration3D::GetIfSecondVolumeExist()
472 if (_wxvtkmpr3Dview_B!=NULL)
478 //----------------------------------------------------------------------------
479 void wxManualRegistration3D::OnCutImagaData(wxCommandEvent &event)
481 if (_btnCutImageData->GetValue()==true){
482 _framePanelCutting = new wxFrame(this,-1,_T("Cutting Module"),wxDefaultPosition,wxDefaultSize,wxCAPTION|wxSTAY_ON_TOP| wxRESIZE_BORDER );
483 _framePanelCutting->SetSize(550,400);
484 _panelCutting = new wxPanelCuttingImageData(_framePanelCutting);
485 _panelCutting->SetWxVtk3DBaseView( _wxvtk3Dbaseview_Clipping3D );
486 _panelCutting->SetVtkMPRBaseData( _vtkmprbasedata_A );
487 _panelCutting->Configure( );
488 _framePanelCutting->Show();
489 // _panelCutting->RefreshView();
492 if (_framePanelCutting!=NULL){
493 _panelCutting->RemoveActors();
494 _framePanelCutting->Close();
495 _framePanelCutting = NULL;
496 _panelCutting = NULL;
501 //--------------------------------------------------------------------------
504 // EOF - wxManualRegistration3D.cxx