00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkPointSetInteractor.h"
00020 #include "mitkPointOperation.h"
00021 #include "mitkPositionEvent.h"
00022 #include "mitkPointSet.h"
00023
00024 #include "mitkDataNode.h"
00025 #include "mitkInteractionConst.h"
00026 #include "mitkAction.h"
00027 #include "mitkStateEvent.h"
00028 #include "mitkOperationEvent.h"
00029 #include "mitkUndoController.h"
00030 #include "mitkStateMachineFactory.h"
00031 #include "mitkStateTransitionOperation.h"
00032 #include "mitkBaseRenderer.h"
00033 #include "mitkRenderingManager.h"
00034
00035
00036
00037
00038 const int PRECISION = 5;
00039
00040 mitk::PointSetInteractor
00041 ::PointSetInteractor(const char * type, DataNode* dataNode, int n)
00042 :Interactor(type, dataNode), m_N(n), m_Precision(PRECISION)
00043 {
00044 if (m_N==0)
00045 {
00046 STATEMACHINE_WARN<<"Instanciation of PointSetInteractor which takes care of 0 points does't make sense!\n";
00047 STATEMACHINE_WARN<<"Setting number of points to 1!\n";
00048 m_N = 1;
00049 }
00050
00051 m_LastPoint.Fill(0);
00052 m_SumVec.Fill(0);
00053 this->InitAccordingToNumberOfPoints();
00054 }
00055
00056 mitk::PointSetInteractor::~PointSetInteractor()
00057 {
00058 }
00059
00060 void mitk::PointSetInteractor::SetPrecision(unsigned int precision)
00061 {
00062 m_Precision = precision;
00063 }
00064
00065
00066
00067 float mitk::PointSetInteractor::CanHandleEvent(StateEvent const* stateEvent) const
00068 {
00069 float returnValue = 0.0;
00070
00071 mitk::DisplayPositionEvent const *disPosEvent =
00072 dynamic_cast <const mitk::DisplayPositionEvent *> (stateEvent->GetEvent());
00073
00074
00075 if (disPosEvent == NULL)
00076 {
00077
00078 if (this->GetCurrentState()->GetTransition(stateEvent->GetId())!=NULL)
00079 {
00080 return 0.5;
00081 }
00082 else
00083 {
00084 return 0;
00085 }
00086 }
00087
00088
00089 if (stateEvent->GetEvent()->GetType() == mitk::Type_MouseMove)
00090 {
00091 return 0;
00092 }
00093
00094
00095 mitk::BaseRenderer* sender = stateEvent->GetEvent()->GetSender();
00096 if (sender != NULL)
00097 {
00098 unsigned int timeStep = sender->GetTimeStep(m_DataNode->GetData());
00099
00100 mitk::State const* state = this->GetCurrentState(timeStep);
00101 if (state!= NULL)
00102 if (state->GetTransition(stateEvent->GetId())!=NULL)
00103 returnValue = 0.5;
00104
00105
00106 mitk::PointSet *pointSet = dynamic_cast<mitk::PointSet*>(m_DataNode->GetData());
00107 if ( pointSet != NULL )
00108 {
00109
00110 if ( (pointSet->GetSize( timeStep ) > 0)
00111 && (pointSet->SearchPoint(
00112 disPosEvent->GetWorldPosition(), m_Precision, timeStep) > -1) )
00113 {
00114 returnValue = 1.0;
00115 }
00116 }
00117 }
00118 return returnValue;
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 void mitk::PointSetInteractor::UnselectAll( unsigned int timeStep, ScalarType timeInMS )
00140 {
00141 mitk::PointSet *pointSet =
00142 dynamic_cast<mitk::PointSet*>( m_DataNode->GetData() );
00143 if ( pointSet == NULL )
00144 {
00145 return;
00146 }
00147
00148 mitk::PointSet::DataType *itkPointSet = pointSet->GetPointSet( timeStep );
00149 if ( itkPointSet == NULL )
00150 {
00151 return;
00152 }
00153
00154 mitk::PointSet::PointsContainer::Iterator it, end;
00155 end = itkPointSet->GetPoints()->End();
00156
00157 for (it = itkPointSet->GetPoints()->Begin(); it != end; it++)
00158 {
00159 int position = it->Index();
00160 PointSet::PointDataType pointData = {0, false, PTUNDEFINED};
00161 itkPointSet->GetPointData( position, &pointData );
00162
00163
00164
00165 if ( pointData.selected )
00166 {
00167 mitk::Point3D noPoint;
00168 noPoint.Fill( 0 );
00169 mitk::PointOperation *doOp = new mitk::PointOperation(
00170 OpDESELECTPOINT, timeInMS, noPoint, position);
00171
00172 if ( m_UndoEnabled )
00173 {
00174 mitk::PointOperation *undoOp =
00175 new mitk::PointOperation(OpSELECTPOINT, timeInMS, noPoint, position);
00176 OperationEvent *operationEvent =
00177 new OperationEvent( pointSet, doOp, undoOp );
00178
00179 m_UndoController->SetOperationEvent( operationEvent );
00180 }
00181
00182 pointSet->ExecuteOperation( doOp );
00183
00184 if ( !m_UndoEnabled )
00185 delete doOp;
00186 }
00187 }
00188 }
00189
00190 void mitk::PointSetInteractor::SelectPoint( int position, unsigned int timeStep, ScalarType timeInMS )
00191 {
00192 mitk::PointSet *pointSet = dynamic_cast< mitk::PointSet * >(
00193 m_DataNode->GetData() );
00194
00195
00196 if ( (pointSet == NULL) || (pointSet->GetSize( timeStep ) <= 0) )
00197 {
00198 return;
00199 }
00200
00201
00202 mitk::Point3D noPoint;
00203 noPoint.Fill(0);
00204
00205 mitk::PointOperation *doOp = new mitk::PointOperation(
00206 OpSELECTPOINT, timeInMS, noPoint, position);
00207
00208 if ( m_UndoEnabled )
00209 {
00210 mitk::PointOperation* undoOp = new mitk::PointOperation(
00211 OpDESELECTPOINT, timeInMS, noPoint, position);
00212
00213 OperationEvent *operationEvent = new OperationEvent(pointSet, doOp, undoOp);
00214 m_UndoController->SetOperationEvent(operationEvent);
00215 }
00216
00217 pointSet->ExecuteOperation( doOp );
00218
00219 if ( !m_UndoEnabled )
00220 delete doOp;
00221
00222 }
00223
00224
00225 bool mitk::PointSetInteractor::ExecuteAction( Action* action, mitk::StateEvent const* stateEvent )
00226 {
00227 bool ok = false;
00228
00229
00230 mitk::PointSet* pointSet =
00231 dynamic_cast<mitk::PointSet*>(m_DataNode->GetData());
00232 if ( pointSet == NULL )
00233 {
00234 return false;
00235 }
00236
00237
00238 const mitk::Event *theEvent = stateEvent->GetEvent();
00239 mitk::ScalarType timeInMS = 0.0;
00240
00241
00242 if ( theEvent )
00243 {
00244 if (theEvent->GetSender() != NULL)
00245 {
00246
00247 timeInMS = theEvent->GetSender()->GetTime();
00248 }
00249 }
00250
00251
00252 mitk::PointSet::DataType *itkPointSet = pointSet->GetPointSet( m_TimeStep );
00253 if ( itkPointSet == NULL )
00254 {
00255 return false;
00256 }
00257
00258 mitk::PointSet::PointsContainer *points = itkPointSet->GetPoints();
00259
00260
00261 switch (action->GetActionId())
00262 {
00263 case AcDONOTHING:
00264 ok = true;
00265 break;
00266 case AcCHECKOPERATION:
00267
00268 {
00269 mitk::DisplayPositionEvent const *dispPosEvent =
00270 dynamic_cast <const mitk::DisplayPositionEvent *> (
00271 stateEvent->GetEvent());
00272
00273 if (dispPosEvent != NULL)
00274 {
00275 mitk::StateEvent* newStateEvent =
00276 new mitk::StateEvent(EIDYES, stateEvent->GetEvent());
00277 this->HandleEvent( newStateEvent );
00278 delete newStateEvent;
00279 }
00280 else
00281 {
00282 mitk::StateEvent* newStateEvent =
00283 new mitk::StateEvent(EIDNO, stateEvent->GetEvent());
00284 this->HandleEvent( newStateEvent );
00285 delete newStateEvent;
00286 }
00287 ok = true;
00288 break;
00289 }
00290
00291 case AcADDPOINT:
00292
00293
00294
00295
00296 {
00297 mitk::DisplayPositionEvent const *posEvent =
00298 dynamic_cast < const mitk::DisplayPositionEvent * >
00299 (stateEvent->GetEvent());
00300
00301
00302
00303
00304
00305 if ( posEvent == NULL )
00306 {
00307 return false;
00308 }
00309
00310 mitk::Point3D itkPoint;
00311 itkPoint = posEvent->GetWorldPosition();
00312
00313
00314
00315 this->UnselectAll( m_TimeStep, timeInMS );
00316
00317
00318
00319
00320 int lastPosition = 0;
00321 if (!points->empty())
00322 {
00323 mitk::PointSet::PointsIterator it, end;
00324 it = points->Begin();
00325 end = points->End();
00326 while( it != end )
00327 {
00328 if (!points->IndexExists(lastPosition))
00329 break;
00330 ++it;
00331 ++lastPosition;
00332 }
00333 }
00334
00335 PointOperation* doOp = new mitk::PointOperation(
00336 OpINSERT, timeInMS, itkPoint, lastPosition);
00337
00338 if (m_UndoEnabled)
00339 {
00340
00341
00342
00343
00344 PointOperation *undoOp = new mitk::PointOperation(
00345 OpREMOVE, timeInMS, itkPoint, lastPosition);
00346 OperationEvent *operationEvent =
00347 new OperationEvent(pointSet, doOp, undoOp, "Add point");
00348 m_UndoController->SetOperationEvent(operationEvent);
00349 }
00350
00351
00352 pointSet->ExecuteOperation(doOp);
00353
00354 if ( !m_UndoEnabled )
00355 delete doOp;
00356
00357
00358
00359 ok = true;
00360
00361
00362 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00363 break;
00364 }
00365 case AcINITMOVEMENT:
00366 {
00367 mitk::PositionEvent const *posEvent = dynamic_cast <const mitk::PositionEvent *> (stateEvent->GetEvent());
00368
00369 if (posEvent == NULL)
00370 return false;
00371
00372
00373
00374 m_LastPoint = posEvent->GetWorldPosition();
00375
00376
00377
00378 m_SumVec.Fill(0);
00379
00380 ok = true;
00381 break;
00382 }
00383 case AcMOVESELECTED:
00384 {
00385 mitk::PositionEvent const *posEvent = dynamic_cast <const mitk::PositionEvent *> (stateEvent->GetEvent());
00386
00387 if (posEvent == NULL)
00388 return false;
00389
00390 mitk::Point3D newPoint, resultPoint;
00391 newPoint = posEvent->GetWorldPosition();
00392
00393
00394
00395
00396
00397
00398
00399 mitk::Vector3D dirVector = newPoint - m_LastPoint;
00400
00401
00402 m_SumVec = m_SumVec + dirVector;
00403
00404 mitk::PointSet::PointsIterator it, end;
00405 it = points->Begin();
00406 end = points->End();
00407 while( it != end )
00408 {
00409 int position = it->Index();
00410 if ( pointSet->GetSelectInfo(position, m_TimeStep) )
00411 {
00412 PointSet::PointType pt = pointSet->GetPoint(position, m_TimeStep);
00413 mitk::Point3D sumVec;
00414 sumVec[0] = pt[0];
00415 sumVec[1] = pt[1];
00416 sumVec[2] = pt[2];
00417 resultPoint = sumVec + dirVector;
00418 PointOperation* doOp = new mitk::PointOperation(OpMOVE, timeInMS,
00419 resultPoint, position);
00420
00421
00422
00423
00424 pointSet->ExecuteOperation(doOp);
00425
00426 delete doOp;
00427 }
00428 ++it;
00429 }
00430 m_LastPoint = newPoint;
00431 ok = true;
00432
00433
00434 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00435 break;
00436 }
00437
00438 case AcREMOVEPOINT:
00439 {
00440
00441 mitk::PositionEvent const *posEvent =
00442 dynamic_cast <const mitk::PositionEvent *> (stateEvent->GetEvent());
00443 if (posEvent != NULL)
00444 {
00445 mitk::Point3D itkPoint;
00446 itkPoint = posEvent->GetWorldPosition();
00447
00448
00449 int position = pointSet->SearchPoint(itkPoint, 0.0, m_TimeStep);
00450
00451
00452 if (position>=0)
00453 {
00454 PointSet::PointType pt = pointSet->GetPoint(position, m_TimeStep);
00455 itkPoint[0] = pt[0];
00456 itkPoint[1] = pt[1];
00457 itkPoint[2] = pt[2];
00458
00459
00460 PointOperation* doOp = new mitk::PointOperation(OpREMOVE,
00461 timeInMS, itkPoint, position);
00462 if (m_UndoEnabled)
00463 {
00464 PointOperation* undoOp = new mitk::PointOperation(OpINSERT,
00465 timeInMS, itkPoint, position);
00466 OperationEvent *operationEvent = new OperationEvent(pointSet,
00467 doOp, undoOp, "Remove point");
00468 m_UndoController->SetOperationEvent(operationEvent);
00469 }
00470
00471 pointSet->ExecuteOperation(doOp);
00472
00473 if ( !m_UndoEnabled )
00474 delete doOp;
00475
00476
00477
00478
00479
00480
00481
00482 if (pointSet->GetSize( m_TimeStep ) > 0)
00483 {
00484 if (position>0)
00485 {
00486 this->SelectPoint( position-1, m_TimeStep, timeInMS );
00487 }
00488
00489
00490 else
00491 {
00492 position = pointSet->GetSize( m_TimeStep ) - 1;
00493 this->SelectPoint( position, m_TimeStep, timeInMS );
00494 }
00495 }
00496
00497 ok = true;
00498 }
00499 }
00500 else
00501 {
00502
00503
00504 mitk::PointSet::PointsContainer::Iterator it, end;
00505 it = points->Begin();
00506 end = points->End();
00507 int position = 0;
00508 int previousExistingPosition = -1;
00509 int lastDelPrevExistPosition = -1;
00510 while (it != end)
00511 {
00512 if (points->IndexExists(it->Index()))
00513 {
00514
00515 if ( pointSet->GetSelectInfo(it->Index(), m_TimeStep) )
00516 {
00517
00518 PointSet::PointType selectedPoint = it->Value();
00519 mitk::Point3D itkPoint;
00520 itkPoint[0] = selectedPoint[0];
00521 itkPoint[1] = selectedPoint[1];
00522 itkPoint[2] = selectedPoint[2];
00523
00524 position = it->Index();
00525 PointOperation* doOp = new mitk::PointOperation(OpREMOVE,
00526 timeInMS, itkPoint, position);
00527
00528 if (m_UndoEnabled)
00529 {
00530 PointOperation* undoOp = new mitk::PointOperation(OpINSERT,
00531 timeInMS, itkPoint, position);
00532 OperationEvent *operationEvent = new OperationEvent(pointSet,
00533 doOp, undoOp, "Remove point");
00534 m_UndoController->SetOperationEvent(operationEvent);
00535 }
00536 pointSet->ExecuteOperation(doOp);
00537
00538 if ( !m_UndoEnabled )
00539 delete doOp;
00540
00541
00542
00543 if (points->Size()>1 && points->IndexExists(previousExistingPosition))
00544 {
00545 for (it = points->Begin(); it != points->End(); it++)
00546 {
00547 if (it->Index() == (unsigned int) previousExistingPosition)
00548 {
00549 lastDelPrevExistPosition = previousExistingPosition;
00550 break;
00551 }
00552 }
00553 }
00554 else
00555 {
00556
00557 for (it = points->Begin(); it != points->End(); it++)
00558 if (points->IndexExists(it->Index()))
00559 {
00560 previousExistingPosition = it->Index();
00561 break;
00562 }
00563 }
00564
00565
00566 if (it == end) { break; }
00567
00568 }
00569 else
00570 {
00571 previousExistingPosition = it->Index();
00572 }
00573 }
00574
00575 it++;
00576 }
00577
00578 if (lastDelPrevExistPosition < 0)
00579 lastDelPrevExistPosition = previousExistingPosition;
00580
00581
00582
00583
00584 if (pointSet->GetSize( m_TimeStep ) > 0)
00585 {
00586 if (points->IndexExists(lastDelPrevExistPosition))
00587 {
00588 this->SelectPoint( lastDelPrevExistPosition, m_TimeStep, timeInMS );
00589 }
00590 else
00591 {
00592
00593 for (mitk::PointSet::PointsContainer::Iterator it = points->Begin(); it != points->End(); it++)
00594 if (points->IndexExists(it->Index()))
00595 {
00596 this->SelectPoint( it->Index(), m_TimeStep, timeInMS );
00597 break;
00598 }
00599 }
00600 }
00601 ok = true;
00602 }
00603 }
00604
00605
00606 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00607 break;
00608
00609
00610
00611 case AcREMOVEALL:
00612 {
00613 if ( !points->empty() )
00614 {
00615 PointSet::PointType pt;
00616 mitk::PointSet::PointsContainer::Iterator it, end;
00617 it = points->Begin();
00618 end = points->End();
00619 int position = 0;
00620 while ( it != end )
00621 {
00622 position = it->Index();
00623 if ( points->IndexExists( position ) )
00624 {
00625 pt = pointSet->GetPoint( position, m_TimeStep );
00626 PointOperation* doOp =
00627 new mitk::PointOperation( OpREMOVE, timeInMS, pt, position );
00628 ++it;
00629 pointSet->ExecuteOperation( doOp );
00630 delete doOp;
00631 }
00632 else it++;
00633 }
00634 }
00635 ok = true;
00636
00637 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00638 break;
00639 }
00640
00641
00642
00643
00644 case AcCHECKELEMENT:
00645 {
00646 mitk::PositionEvent const *posEvent =
00647 dynamic_cast <const mitk::PositionEvent *> (stateEvent->GetEvent());
00648 if (posEvent != NULL)
00649 {
00650 mitk::Point3D worldPoint = posEvent->GetWorldPosition();
00651
00652 int position = pointSet->SearchPoint( worldPoint, m_Precision, m_TimeStep );
00653 if (position>=0)
00654 {
00655
00656 PointSet::PointType pt = pointSet->GetPoint(position, m_TimeStep);
00657 mitk::Point2D displPoint;
00658 displPoint[0] = worldPoint[0]; displPoint[1] = worldPoint[1];
00659
00660 mitk::PositionEvent const* newPosEvent =
00661 new mitk::PositionEvent(posEvent->GetSender(), Type_None,
00662 BS_NoButton, BS_NoButton, Key_none, displPoint, pt);
00663 mitk::StateEvent* newStateEvent =
00664 new mitk::StateEvent(EIDYES, newPosEvent);
00665
00666 this->HandleEvent( newStateEvent );
00667 delete newStateEvent;
00668 delete newPosEvent;
00669 ok = true;
00670 }
00671 else
00672 {
00673
00674 mitk::StateEvent* newStateEvent = new mitk::StateEvent(EIDNO, posEvent);
00675 this->HandleEvent(newStateEvent );
00676 delete newStateEvent;
00677 ok = true;
00678 }
00679 }
00680 else
00681 {
00682 STATEMACHINE_DEBUG("OperationError")<<this->GetType()<<" AcCHECKELEMENT expected PointOperation.";
00683
00684 mitk::DisplayPositionEvent const *disPosEvent =
00685 dynamic_cast <const mitk::DisplayPositionEvent *> (
00686 stateEvent->GetEvent());
00687 if (disPosEvent != NULL)
00688 {
00689
00690 mitk::StateEvent* newStateEvent =
00691 new mitk::StateEvent(EIDNO, disPosEvent);
00692 this->HandleEvent(newStateEvent );
00693 delete newStateEvent;
00694 ok = true;
00695 }
00696 }
00697
00698 break;
00699 }
00700 case AcCHECKONESELECTED:
00701
00702 {
00703 if (pointSet->GetNumberOfSelected(m_TimeStep)>0)
00704 {
00705 mitk::StateEvent* newStateEvent =
00706 new mitk::StateEvent( EIDYES, theEvent);
00707 this->HandleEvent( newStateEvent );
00708 delete newStateEvent;
00709
00710 }
00711 else
00712 {
00713
00714 mitk::StateEvent* newStateEvent =
00715 new mitk::StateEvent( EIDNO, theEvent);
00716 this->HandleEvent( newStateEvent );
00717 delete newStateEvent;
00718 }
00719 ok = true;
00720 break;
00721 }
00722 case AcCHECKSELECTED:
00723
00724
00725
00726
00727
00728
00729
00730
00731 {
00732 int position = -1;
00733 mitk::PositionEvent const *posEvent =
00734 dynamic_cast <const mitk::PositionEvent *> (stateEvent->GetEvent());
00735 if (posEvent == NULL)
00736 return false;
00737 mitk::Point3D worldPoint = posEvent->GetWorldPosition();
00738
00739 position = pointSet->SearchPoint(worldPoint, m_Precision, m_TimeStep);
00740
00741 if (position>=0)
00742 {
00743 mitk::PositionEvent const *newPosEvent =
00744 new mitk::PositionEvent(posEvent->GetSender(),
00745 posEvent->GetType(), posEvent->GetButton(),
00746 posEvent->GetButtonState(), posEvent->GetKey(),
00747 posEvent->GetDisplayPosition(), posEvent->GetWorldPosition());
00748
00749
00750 if (pointSet->GetSelectInfo(position, m_TimeStep))
00751 {
00752 mitk::StateEvent* newStateEvent =
00753 new mitk::StateEvent( EIDYES, newPosEvent );
00754 this->HandleEvent( newStateEvent );
00755 delete newStateEvent;
00756 ok = true;
00757
00758
00759 m_LastPoint = posEvent->GetWorldPosition();
00760 }
00761 else
00762 {
00763
00764 mitk::StateEvent* newStateEvent =
00765 new mitk::StateEvent( EIDNO, newPosEvent );
00766 this->HandleEvent( newStateEvent );
00767 delete newStateEvent;
00768 ok = true;
00769 }
00770 delete newPosEvent;
00771 }
00772
00773
00774 else
00775 {
00776
00777
00778
00779
00780
00781 ok = false;
00782 }
00783
00784 break;
00785 }
00786
00787
00788
00789 case AcCHECKNMINUS1:
00790 {
00791
00792
00793 if (m_N<0)
00794 {
00795 mitk::StateEvent* newStateEvent =
00796 new mitk::StateEvent(EIDSTSMALERNMINUS1, stateEvent->GetEvent());
00797 this->HandleEvent( newStateEvent );
00798 delete newStateEvent;
00799 ok = true;
00800 }
00801 else
00802 {
00803 if (pointSet->GetSize( m_TimeStep ) < m_N-1 )
00804
00805 {
00806 mitk::StateEvent* newStateEvent =
00807 new mitk::StateEvent(EIDSTSMALERNMINUS1, stateEvent->GetEvent());
00808 this->HandleEvent( newStateEvent );
00809 delete newStateEvent;
00810 ok = true;
00811 }
00812 else
00813
00814 {
00815 mitk::StateEvent* newStateEvent =
00816 new mitk::StateEvent(EIDSTLARGERNMINUS1, stateEvent->GetEvent());
00817 this->HandleEvent(newStateEvent );
00818 delete newStateEvent;
00819 ok = true;
00820 }
00821 }
00822 }
00823 break;
00824 case AcCHECKEQUALS1:
00825 {
00826
00827 if (pointSet->GetSize( m_TimeStep ) <= 1)
00828 {
00829 mitk::StateEvent* newStateEvent =
00830 new mitk::StateEvent(EIDYES, stateEvent->GetEvent());
00831 this->HandleEvent( newStateEvent );
00832 delete newStateEvent;
00833 ok = true;
00834 }
00835 else
00836 {
00837 mitk::StateEvent* newStateEvent =
00838 new mitk::StateEvent(EIDNO, stateEvent->GetEvent());
00839 this->HandleEvent(newStateEvent );
00840 delete newStateEvent;
00841 ok = true;
00842 }
00843 }
00844 break;
00845 case AcCHECKNUMBEROFPOINTS:
00846 {
00847
00848 if (pointSet->GetSize( m_TimeStep ) <= 1)
00849 {
00850 mitk::StateEvent* newStateEvent =
00851 new mitk::StateEvent(EIDEMPTY, stateEvent->GetEvent());
00852 this->HandleEvent( newStateEvent );
00853 delete newStateEvent;
00854 ok = true;
00855 }
00856 else if (pointSet->GetSize( m_TimeStep ) <= m_N || m_N <= -1)
00857
00858 {
00859 mitk::StateEvent* newStateEvent =
00860 new mitk::StateEvent(EIDSMALLERN, stateEvent->GetEvent());
00861 this->HandleEvent(newStateEvent );
00862 delete newStateEvent;
00863 ok = true;
00864 }
00865 else
00866
00867
00868
00869 {
00870 mitk::StateEvent* newStateEvent =
00871 new mitk::StateEvent(EIDEQUALSN, stateEvent->GetEvent());
00872 this->HandleEvent(newStateEvent );
00873 delete newStateEvent;
00874 ok = true;
00875 }
00876 }
00877 break;
00878 case AcSELECTPICKEDOBJECT:
00879 {
00880 mitk::PositionEvent const *posEvent =
00881 dynamic_cast <const mitk::PositionEvent *> (stateEvent->GetEvent());
00882 if (posEvent == NULL) return false;
00883
00884 mitk::Point3D itkPoint;
00885 itkPoint = posEvent->GetWorldPosition();
00886
00887
00888 int position = pointSet->SearchPoint(itkPoint, 0.0, m_TimeStep);
00889
00890
00891 if (position>=0)
00892 {
00893
00894
00895 this->UnselectAll( m_TimeStep, timeInMS);
00896
00897 PointOperation* doOp = new mitk::PointOperation(OpSELECTPOINT,
00898 timeInMS, itkPoint, position);
00899
00900
00901 if (m_UndoEnabled)
00902 {
00903 PointOperation* undoOp = new mitk::PointOperation(OpDESELECTPOINT,
00904 timeInMS, itkPoint, position);
00905 OperationEvent *operationEvent =
00906 new OperationEvent(pointSet, doOp, undoOp);
00907 m_UndoController->SetOperationEvent(operationEvent);
00908 }
00909
00910
00911 pointSet->ExecuteOperation(doOp);
00912
00913 if ( !m_UndoEnabled )
00914 delete doOp;
00915
00916 ok = true;
00917 }
00918
00919
00920 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00921 break;
00922 }
00923
00924 case AcDESELECTOBJECT:
00925 {
00926 mitk::PositionEvent const *posEvent =
00927 dynamic_cast <const mitk::PositionEvent *> (stateEvent->GetEvent());
00928 if (posEvent == NULL)
00929 return false;
00930
00931 mitk::Point3D itkPoint;
00932 itkPoint = posEvent->GetWorldPosition();
00933
00934
00935 int position = pointSet->SearchPoint(itkPoint, 0.0, m_TimeStep);
00936
00937
00938
00939 if (position>=0)
00940 {
00941
00942 PointOperation* doOp = new mitk::PointOperation(OpDESELECTPOINT,
00943 timeInMS, itkPoint, position);
00944 if (m_UndoEnabled)
00945 {
00946 PointOperation* undoOp = new mitk::PointOperation(OpSELECTPOINT,
00947 timeInMS, itkPoint, position);
00948 OperationEvent *operationEvent = new OperationEvent(pointSet, doOp, undoOp);
00949 m_UndoController->SetOperationEvent(operationEvent);
00950 }
00951
00952 pointSet->ExecuteOperation(doOp);
00953
00954 if ( !m_UndoEnabled )
00955 delete doOp;
00956
00957 ok = true;
00958 }
00959
00960
00961 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00962 break;
00963 }
00964
00965 case AcDESELECTALL:
00966 {
00967
00968 this->UnselectAll( m_TimeStep, timeInMS );
00969 ok = true;
00970
00971
00972 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00973 break;
00974 }
00975
00976 case AcFINISHMOVEMENT:
00977 {
00978 mitk::PositionEvent const *posEvent =
00979 dynamic_cast <const mitk::PositionEvent *> (stateEvent->GetEvent());
00980 if (posEvent == NULL)
00981 return false;
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992 mitk::PointSet::PointsIterator it, end;
00993 it = points->Begin();
00994 end = points->End();
00995 while( it != end )
00996 {
00997 int position = it->Index();
00998 if ( pointSet->GetSelectInfo(position, m_TimeStep) )
00999 {
01000 PointSet::PointType pt = pointSet->GetPoint(position, m_TimeStep);
01001 Point3D itkPoint;
01002 itkPoint[0] = pt[0];
01003 itkPoint[1] = pt[1];
01004 itkPoint[2] = pt[2];
01005 PointOperation* doOp = new mitk::PointOperation(OpMOVE,
01006 timeInMS, itkPoint, position);
01007
01008 if ( m_UndoEnabled )
01009 {
01010
01011
01012 mitk::Point3D undoPoint = ( itkPoint - m_SumVec );
01013 PointOperation* undoOp =
01014 new mitk::PointOperation(OpMOVE, timeInMS, undoPoint, position);
01015 OperationEvent *operationEvent =
01016 new OperationEvent(pointSet, doOp, undoOp, "Move point");
01017 m_UndoController->SetOperationEvent(operationEvent);
01018 }
01019
01020 pointSet->ExecuteOperation(doOp);
01021
01022 if ( !m_UndoEnabled )
01023 delete doOp;
01024
01025 }
01026 ++it;
01027 }
01028
01029
01030
01031
01032
01033
01034
01035 this->IncCurrGroupEventId();
01036 ok = true;
01037
01038
01039 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
01040 break;
01041 }
01042
01043 case AcCLEAR:
01044 {
01045 this->Clear( m_TimeStep, timeInMS );
01046
01047
01048 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
01049 break;
01050 }
01051
01052 default:
01053 return Superclass::ExecuteAction( action, stateEvent );
01054 }
01055
01056 m_DataNode->Modified();
01057 return ok;
01058 }
01059
01060 void mitk::PointSetInteractor::Clear( unsigned int timeStep, ScalarType timeInMS )
01061 {
01062 mitk::Point3D point;
01063 point.Fill(0);
01064
01065 mitk::PointSet *pointSet =
01066 dynamic_cast<mitk::PointSet*>(m_DataNode->GetData());
01067 if ( pointSet == NULL )
01068 {
01069 return;
01070 }
01071
01072 mitk::PointSet::DataType *itkPointSet = pointSet->GetPointSet( timeStep );
01073 if ( itkPointSet == NULL )
01074 {
01075 return;
01076 }
01077
01078
01079 mitk::PointSet::PointsContainer *points = itkPointSet->GetPoints();
01080
01081 mitk::PointSet::PointsIterator it, end;
01082 it = points->Begin();
01083 end = points->End();
01084 while( (it != end) && (pointSet->GetSize( timeStep ) > 0) )
01085 {
01086 point = pointSet->GetPoint( it->Index(), timeStep );
01087 PointOperation *doOp = new mitk::PointOperation(
01088 OpREMOVE, timeInMS, point, it->Index());
01089
01090
01091 if ( m_UndoEnabled )
01092 {
01093 PointOperation *undoOp = new mitk::PointOperation(
01094 OpINSERT, timeInMS, point, it->Index());
01095
01096 OperationEvent *operationEvent =
01097 new OperationEvent( pointSet, doOp, undoOp );
01098
01099 m_UndoController->SetOperationEvent( operationEvent );
01100 }
01101
01102
01103 ++it;
01104 pointSet->ExecuteOperation( doOp );
01105
01106 if ( !m_UndoEnabled )
01107 delete doOp;
01108
01109 }
01110
01111
01112 this->ResetStatemachineToStartState(timeStep);
01113 }
01114
01115
01116 void mitk::PointSetInteractor::InitAccordingToNumberOfPoints()
01117 {
01118 if (m_DataNode == NULL)
01119 return;
01120
01121 mitk::PointSet *pointSet = dynamic_cast<mitk::PointSet*>(m_DataNode->GetData());
01122 if ( pointSet != NULL )
01123 {
01124
01125 this->ExpandStartStateVector(pointSet->GetPointSetSeriesSize());
01126
01127 for (unsigned int timestep = 0; timestep < pointSet->GetPointSetSeriesSize(); timestep++)
01128 {
01129
01130 this->UpdateTimeStep(timestep);
01131
01132 int numberOfPoints = pointSet->GetSize( timestep );
01133 if (numberOfPoints == 0)
01134 continue;
01135 else
01136 {
01137
01138 this->UnselectAll(timestep);
01139
01140 if (numberOfPoints<m_N || m_N <= -1)
01141 {
01142
01143 const mitk::Event* nullEvent = new mitk::Event(NULL, Type_User, BS_NoButton, BS_NoButton, Key_none);
01144 mitk::StateEvent* newStateEvent =
01145 new mitk::StateEvent(EIDSMALLERN, nullEvent);
01146 this->HandleEvent( newStateEvent );
01147 delete newStateEvent;
01148 delete nullEvent;
01149 }
01150 else if (numberOfPoints>=m_N)
01151 {
01152 if (numberOfPoints>m_N)
01153 {
01154 STATEMACHINE_WARN<<"Point Set contains more points than needed!\n";
01155 }
01156
01157 const mitk::Event* nullEvent = new mitk::Event(NULL, Type_User, BS_NoButton, BS_NoButton, Key_none);
01158 mitk::StateEvent* newStateEvent =
01159 new mitk::StateEvent(EIDEQUALSN, nullEvent);
01160 this->HandleEvent( newStateEvent );
01161 delete newStateEvent;
01162 delete nullEvent;
01163 }
01164 }
01165 }
01166 }
01167 return;
01168 }
01169
01170 void mitk::PointSetInteractor::DataChanged()
01171 {
01172 this->InitAccordingToNumberOfPoints();
01173 return;
01174 }