Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkDisplayCoordinateOperation.h"
00020
00021 #include "mitkCoordinateSupplier.h"
00022 #include "mitkOperation.h"
00023 #include "mitkOperationActor.h"
00024 #include "mitkPointOperation.h"
00025 #include "mitkPositionEvent.h"
00026 #include "mitkStateEvent.h"
00027 #include "mitkUndoController.h"
00028
00029 #include <string>
00030 #include "mitkInteractionConst.h"
00031 #include "mitkAction.h"
00032
00033
00034 mitk::CoordinateSupplier::CoordinateSupplier(const char * type, mitk::OperationActor* operationActor)
00035 : mitk::StateMachine(type), m_Destination(operationActor)
00036 {
00037 m_CurrentPoint.Fill(0);
00038 }
00039
00040 mitk::CoordinateSupplier::~CoordinateSupplier()
00041 {
00042
00043 }
00044
00045 bool mitk::CoordinateSupplier::ExecuteAction(Action* action, mitk::StateEvent const* stateEvent)
00046 {
00047 bool ok = false;
00048
00049 const PositionEvent* posEvent = dynamic_cast<const PositionEvent*>(stateEvent->GetEvent());
00050
00051 PointOperation* doOp=NULL;
00052 if(posEvent!=NULL)
00053 {
00054 ScalarType timeInMS = 0;
00055 if(stateEvent->GetEvent()->GetSender()!=NULL)
00056 {
00057 const Geometry2D* worldGeometry = stateEvent->GetEvent()->GetSender()->GetCurrentWorldGeometry2D();
00058 assert( worldGeometry != NULL );
00059 timeInMS = worldGeometry->GetTimeBounds()[ 0 ];
00060 }
00061 else
00062 {
00063 itkWarningMacro(<<"StateEvent::GetSender()==NULL - setting timeInMS to 0");
00064 }
00065
00066 switch (action->GetActionId())
00067 {
00068 case AcNEWPOINT:
00069 {
00070 if (m_Destination == NULL)
00071 return false;
00072 m_OldPoint = posEvent->GetWorldPosition();
00073
00074 doOp = new mitk::PointOperation(OpADD, timeInMS, m_OldPoint, 0);
00075
00076 if (m_UndoEnabled)
00077 {
00078 PointOperation* undoOp = new PointOperation(OpDELETE, m_OldPoint, 0);
00079 OperationEvent *operationEvent = new OperationEvent( m_Destination, doOp, undoOp );
00080 m_UndoController->SetOperationEvent(operationEvent);
00081 }
00082
00083 m_Destination->ExecuteOperation(doOp);
00084 ok = true;
00085 break;
00086 }
00087 case AcINITMOVEMENT:
00088 {
00089 if (m_Destination == NULL)
00090 return false;
00091
00092 mitk::Point3D movePoint = posEvent->GetWorldPosition();
00093
00094 doOp = new mitk::PointOperation(OpMOVE, timeInMS, movePoint, 0);
00095
00096 m_Destination->ExecuteOperation(doOp);
00097 ok = true;
00098 break;
00099 }
00100 case AcMOVEPOINT:
00101 case AcMOVE:
00102 {
00103 mitk::Point3D movePoint = posEvent->GetWorldPosition();
00104 m_CurrentPoint = movePoint;
00105 if (m_Destination == NULL)
00106 return false;
00107 doOp = new mitk::PointOperation(OpMOVE, timeInMS, movePoint, 0);
00108
00109 m_Destination->ExecuteOperation(doOp);
00110 ok = true;
00111 break;
00112 }
00113 case AcFINISHMOVEMENT:
00114 {
00115 if (m_Destination == NULL)
00116 return false;
00117
00118
00119
00120 mitk::Point3D movePoint = posEvent->GetWorldPosition();
00121 mitk::Point3D oldMovePoint; oldMovePoint.Fill(0);
00122
00123 doOp = new mitk::PointOperation(OpMOVE, timeInMS, movePoint, 0);
00124 PointOperation* finishOp = new mitk::PointOperation(OpTERMINATE, movePoint, 0);
00125 if (m_UndoEnabled )
00126 {
00127
00128 OperationEvent *lastOperationEvent = m_UndoController->GetLastOfType(m_Destination, OpMOVE);
00129 if (lastOperationEvent != NULL)
00130 {
00131 PointOperation* lastOp = dynamic_cast<PointOperation *>(lastOperationEvent->GetOperation());
00132 if (lastOp != NULL)
00133 {
00134 oldMovePoint = lastOp->GetPoint();
00135 }
00136 }
00137 PointOperation* undoOp = new PointOperation(OpMOVE, timeInMS, oldMovePoint, 0, "Move slices");
00138 OperationEvent *operationEvent = new OperationEvent(m_Destination, doOp, undoOp, "Move slices");
00139 m_UndoController->SetOperationEvent(operationEvent);
00140 }
00141
00142 m_Destination->ExecuteOperation(doOp);
00143 m_Destination->ExecuteOperation(finishOp);
00144 ok = true;
00145 delete finishOp;
00146
00147 break;
00148 }
00149 default:
00150 ok = false;
00151 break;
00152 }
00153 return ok;
00154 }
00155
00156 const mitk::DisplayPositionEvent* displPosEvent = dynamic_cast<const mitk::DisplayPositionEvent *>(stateEvent->GetEvent());
00157 if(displPosEvent!=NULL)
00158 {
00159 return true;
00160 }
00161
00162 return false;
00163 }