00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkTool.h"
00019 #include "mitkDataNodeFactory.h"
00020 #include "mitkProperties.h"
00021 #include "mitkLevelWindowProperty.h"
00022 #include "mitkVtkResliceInterpolationProperty.h"
00023
00024 #include <itkObjectFactory.h>
00025
00026 mitk::Tool::Tool(const char* type)
00027 : StateMachine(type),
00028 m_SupportRoi(false),
00029
00030 m_PredicateImages(NodePredicateDataType::New("Image")),
00031 m_PredicateDim3(NodePredicateDimension::New(3, 1)),
00032 m_PredicateDim4(NodePredicateDimension::New(4, 1)),
00033 m_PredicateDimension( mitk::NodePredicateOr::New(m_PredicateDim3, m_PredicateDim4) ),
00034 m_PredicateImage3D( NodePredicateAnd::New(m_PredicateImages, m_PredicateDimension) ),
00035
00036 m_PredicateBinary(NodePredicateProperty::New("binary", BoolProperty::New(true))),
00037 m_PredicateNotBinary( NodePredicateNot::New(m_PredicateBinary) ),
00038
00039 m_PredicateSegmentation(NodePredicateProperty::New("segmentation", BoolProperty::New(true))),
00040 m_PredicateNotSegmentation( NodePredicateNot::New(m_PredicateSegmentation) ),
00041
00042 m_PredicateHelper(NodePredicateProperty::New("helper object", BoolProperty::New(true))),
00043 m_PredicateNotHelper( NodePredicateNot::New(m_PredicateHelper) ),
00044
00045 m_PredicateImageColorful( NodePredicateAnd::New(m_PredicateNotBinary, m_PredicateNotSegmentation) ),
00046
00047 m_PredicateImageColorfulNotHelper( NodePredicateAnd::New(m_PredicateImageColorful, m_PredicateNotHelper) ),
00048
00049 m_PredicateReference( NodePredicateAnd::New(m_PredicateImage3D, m_PredicateImageColorfulNotHelper) ),
00050
00051
00052 m_IsSegmentationPredicate(NodePredicateAnd::New(NodePredicateOr::New(m_PredicateBinary, m_PredicateSegmentation), m_PredicateNotHelper))
00053 {
00054 }
00055
00056 mitk::Tool::~Tool()
00057 {
00058 }
00059
00060 const char* mitk::Tool::GetGroup() const
00061 {
00062 return "default";
00063 }
00064
00065 void mitk::Tool::SetToolManager(ToolManager* manager)
00066 {
00067 m_ToolManager = manager;
00068 }
00069
00070 void mitk::Tool::Activated()
00071 {
00072 }
00073
00074 void mitk::Tool::Deactivated()
00075 {
00076 StateMachine::ResetStatemachineToStartState();
00077 }
00078
00079 itk::Object::Pointer mitk::Tool::GetGUI(const std::string& toolkitPrefix, const std::string& toolkitPostfix)
00080 {
00081 itk::Object::Pointer object;
00082
00083 std::string classname = this->GetNameOfClass();
00084 std::string guiClassname = toolkitPrefix + classname + toolkitPostfix;
00085
00086 std::list<itk::LightObject::Pointer> allGUIs = itk::ObjectFactoryBase::CreateAllInstance(guiClassname.c_str());
00087 for( std::list<itk::LightObject::Pointer>::iterator iter = allGUIs.begin();
00088 iter != allGUIs.end();
00089 ++iter )
00090 {
00091 if (object.IsNull())
00092 {
00093 object = dynamic_cast<itk::Object*>( iter->GetPointer() );
00094 }
00095 else
00096 {
00097 MITK_ERROR << "There is more than one GUI for " << classname << " (several factories claim ability to produce a " << guiClassname << " ) " << std::endl;
00098 return NULL;
00099 }
00100 }
00101
00102 return object;
00103 }
00104
00105 mitk::NodePredicateBase::ConstPointer mitk::Tool::GetReferenceDataPreference() const
00106 {
00107 return m_PredicateReference.GetPointer();
00108 }
00109
00110
00111 mitk::NodePredicateBase::ConstPointer mitk::Tool::GetWorkingDataPreference() const
00112 {
00113 return m_IsSegmentationPredicate.GetPointer();
00114 }
00115
00116 mitk::DataNode::Pointer mitk::Tool::CreateEmptySegmentationNode( Image* original, const std::string& organName, const mitk::Color& color )
00117 {
00118
00119 if (!original) return NULL;
00120
00121
00122 PixelType pixelType( typeid(DefaultSegmentationDataType) );
00123 Image::Pointer segmentation = Image::New();
00124
00125 segmentation->Initialize( pixelType, original->GetDimension(), original->GetDimensions() );
00126
00127 unsigned int byteSize = sizeof(DefaultSegmentationDataType);
00128 for (unsigned int dim = 0; dim < segmentation->GetDimension(); ++dim)
00129 {
00130 byteSize *= segmentation->GetDimension(dim);
00131 }
00132 memset( segmentation->GetData(), 0, byteSize );
00133
00134 if (original->GetTimeSlicedGeometry() )
00135 {
00136 AffineGeometryFrame3D::Pointer originalGeometryAGF = original->GetTimeSlicedGeometry()->Clone();
00137 TimeSlicedGeometry::Pointer originalGeometry = dynamic_cast<TimeSlicedGeometry*>( originalGeometryAGF.GetPointer() );
00138 segmentation->SetGeometry( originalGeometry );
00139 }
00140 else
00141 {
00142 Tool::ErrorMessage("Original image does not have a 'Time sliced geometry'! Cannot create a segmentation.");
00143 return NULL;
00144 }
00145
00146 return CreateSegmentationNode( segmentation, organName, color );
00147 }
00148
00149 mitk::DataNode::Pointer mitk::Tool::CreateSegmentationNode( Image* image, const std::string& organName, const mitk::Color& color )
00150 {
00151 if (!image) return NULL;
00152
00153
00154 DataNode::Pointer segmentationNode = DataNode::New();
00155 segmentationNode->SetData( image );
00156
00157
00158 segmentationNode->SetProperty( "name", StringProperty::New( organName ) );
00159
00160
00161 segmentationNode->SetProperty( "binary", BoolProperty::New(true) );
00162 segmentationNode->SetProperty( "color", ColorProperty::New(color) );
00163 segmentationNode->SetProperty( "texture interpolation", BoolProperty::New(false) );
00164 segmentationNode->SetProperty( "layer", IntProperty::New(10) );
00165 segmentationNode->SetProperty( "levelwindow", LevelWindowProperty::New( LevelWindow(0.5, 1) ) );
00166 segmentationNode->SetProperty( "opacity", FloatProperty::New(0.3) );
00167 segmentationNode->SetProperty( "segmentation", BoolProperty::New(true) );
00168 segmentationNode->SetProperty( "reslice interpolation", VtkResliceInterpolationProperty::New() );
00169
00170 segmentationNode->SetProperty( "showVolume", BoolProperty::New( true ) );
00171
00172 return segmentationNode;
00173 }
00174