25 , m_TagCache( nullptr )
26 , m_PropertiesOutOfDate( true )
28 m_PropertyFunctor = &mitk::DICOMImageBlockDescriptor::GetPropertyForDICOMValues;
36 : m_ImageFrameList( other.m_ImageFrameList )
37 , m_MitkImage( other.m_MitkImage )
38 , m_SliceIsLoaded( other.m_SliceIsLoaded )
39 , m_ReaderImplementationLevel( other.m_ReaderImplementationLevel )
40 , m_TiltInformation( other.m_TiltInformation )
41 , m_PropertyList( other.m_PropertyList->
Clone() )
42 , m_TagCache( other.m_TagCache )
43 , m_PropertiesOutOfDate( other.m_PropertiesOutOfDate )
44 , m_AdditionalTagMap(other.m_AdditionalTagMap)
45 , m_FoundAdditionalTags(other.m_FoundAdditionalTags)
46 , m_PropertyFunctor(other.m_PropertyFunctor)
50 m_MitkImage = m_MitkImage->Clone();
53 m_PropertyFunctor = &mitk::DICOMImageBlockDescriptor::GetPropertyForDICOMValues;
61 m_ImageFrameList = other.m_ImageFrameList;
62 m_MitkImage = other.m_MitkImage;
63 m_SliceIsLoaded = other.m_SliceIsLoaded;
64 m_ReaderImplementationLevel = other.m_ReaderImplementationLevel;
65 m_TiltInformation = other.m_TiltInformation;
67 m_AdditionalTagMap = other.m_AdditionalTagMap;
68 m_FoundAdditionalTags = other.m_FoundAdditionalTags;
69 m_PropertyFunctor = other.m_PropertyFunctor;
71 if ( other.m_PropertyList )
73 m_PropertyList = other.m_PropertyList->Clone();
76 if ( other.m_MitkImage )
78 m_MitkImage = other.m_MitkImage->Clone();
81 m_TagCache = other.m_TagCache;
82 m_PropertiesOutOfDate = other.m_PropertiesOutOfDate;
91 completeList.push_back(
DICOMTag( 0x0018, 0x1164 ) );
92 completeList.push_back(
DICOMTag( 0x0028, 0x0030 ) );
94 completeList.push_back(
DICOMTag( 0x0008, 0x0018 ) );
95 completeList.push_back(
DICOMTag( 0x0008, 0x0016 ) );
97 completeList.push_back(
DICOMTag( 0x0020, 0x0011 ) );
98 completeList.push_back(
DICOMTag( 0x0008, 0x1030 ) );
99 completeList.push_back(
DICOMTag( 0x0008, 0x103e ) );
100 completeList.push_back(
DICOMTag( 0x0008, 0x0060 ) );
101 completeList.push_back(
DICOMTag( 0x0018, 0x0024 ) );
102 completeList.push_back(
DICOMTag( 0x0020, 0x0037 ) );
104 completeList.push_back(
DICOMTag( 0x0020, 0x1041 ) );
105 completeList.push_back(
DICOMTag( 0x0020, 0x0012 ) );
106 completeList.push_back(
DICOMTag( 0x0020, 0x0013 ) );
107 completeList.push_back(
DICOMTag( 0x0020, 0x0032 ) );
109 completeList.push_back(
DICOMTag( 0x0028, 0x1050 ) );
110 completeList.push_back(
DICOMTag( 0x0028, 0x1051 ) );
111 completeList.push_back(
DICOMTag( 0x0008, 0x0008 ) );
112 completeList.push_back(
DICOMTag( 0x0028, 0x0004 ) );
121 m_AdditionalTagMap = tagMap;
127 m_TiltInformation =
info;
132 return m_TiltInformation;
137 m_ImageFrameList = framelist;
138 m_SliceIsLoaded.resize( framelist.size() );
139 m_SliceIsLoaded.assign( framelist.size(), false );
141 m_PropertiesOutOfDate =
true;
146 return m_ImageFrameList;
151 if ( m_MitkImage != image )
153 if ( m_TagCache.IsNull() )
155 MITK_ERROR <<
"Unable to describe MITK image with properties without a tag-cache object!";
156 m_MitkImage =
nullptr;
160 if ( m_ImageFrameList.empty() )
162 MITK_ERROR <<
"Unable to describe MITK image with properties without a frame list!";
163 m_MitkImage =
nullptr;
173 m_MitkImage = this->DescribeImageWithProperties( this->FixupSpacing( image ) );
190 this->GetDesiredMITKImagePixelSpacing(
191 desiredSpacingX, desiredSpacingY );
193 if ( desiredSpacingX <= 0 || desiredSpacingY <= 0 )
198 MITK_DEBUG <<
"Loaded image with spacing " << imageSpacing[0] <<
", " << imageSpacing[1];
199 MITK_DEBUG <<
"Found correct spacing info " << desiredSpacingX <<
", " << desiredSpacingY;
201 imageSpacing[0] = desiredSpacingX;
202 imageSpacing[1] = desiredSpacingY;
208 void mitk::DICOMImageBlockDescriptor::SetSliceIsLoaded(
unsigned int index,
bool isLoaded )
210 if ( index < m_SliceIsLoaded.size() )
212 m_SliceIsLoaded[index] = isLoaded;
216 std::stringstream ss;
217 ss <<
"Index " << index <<
" out of range (" << m_SliceIsLoaded.size() <<
" indices reserved)";
218 throw std::invalid_argument( ss.str() );
222 bool mitk::DICOMImageBlockDescriptor::IsSliceLoaded(
unsigned int index )
const
224 if ( index < m_SliceIsLoaded.size() )
226 return m_SliceIsLoaded[index];
230 std::stringstream ss;
231 ss <<
"Index " << index <<
" out of range (" << m_SliceIsLoaded.size() <<
" indices reserved)";
232 throw std::invalid_argument( ss.str() );
236 bool mitk::DICOMImageBlockDescriptor::AllSlicesAreLoaded()
const
238 bool allLoaded =
true;
239 for (
auto iter = m_SliceIsLoaded.cbegin(); iter != m_SliceIsLoaded.cend(); ++iter )
259 if ( m_ImageFrameList.empty() || m_TagCache.IsNull() )
261 MITK_ERROR <<
"Invalid call to GetPixelSpacingInterpretation. Need to have initialized tag-cache!";
265 const std::string pixelSpacing = this->GetPixelSpacing();
266 const std::string imagerPixelSpacing = this->GetImagerPixelSpacing();
268 if ( pixelSpacing.empty() )
270 if ( imagerPixelSpacing.empty() )
281 if ( imagerPixelSpacing.empty() )
285 else if ( pixelSpacing != imagerPixelSpacing )
296 std::string mitk::DICOMImageBlockDescriptor::GetPixelSpacing()
const
298 if ( m_ImageFrameList.empty() || m_TagCache.IsNull() )
300 MITK_ERROR <<
"Invalid call to GetPixelSpacing. Need to have initialized tag-cache!";
301 return std::string(
"" );
304 static const DICOMTag tagPixelSpacing( 0x0028, 0x0030 );
305 return m_TagCache->GetTagValue( m_ImageFrameList.front(), tagPixelSpacing ).value;
308 std::string mitk::DICOMImageBlockDescriptor::GetImagerPixelSpacing()
const
310 if ( m_ImageFrameList.empty() || m_TagCache.IsNull() )
312 MITK_ERROR <<
"Invalid call to GetImagerPixelSpacing. Need to have initialized tag-cache!";
313 return std::string(
"" );
316 static const DICOMTag tagImagerPixelSpacing( 0x0018, 0x1164 );
317 return m_TagCache->GetTagValue( m_ImageFrameList.front(), tagImagerPixelSpacing ).value;
323 const std::string pixelSpacing = this->GetPixelSpacing();
327 const std::string imagerPixelSpacing = this->GetImagerPixelSpacing();
332 spacingX = spacingY = 1.0;
339 m_PropertyList->SetProperty( key, value );
344 this->UpdateImageDescribingProperties();
345 return m_PropertyList->GetProperty( key );
350 this->UpdateImageDescribingProperties();
352 if ( property.IsNotNull() )
354 return property->GetValueAsString();
358 return std::string(
"" );
369 this->UpdateImageDescribingProperties();
371 if ( boolProp.IsNotNull() )
373 return boolProp->GetValue();
388 this->UpdateImageDescribingProperties();
390 if ( intProp.IsNotNull() )
392 return intProp->GetValue();
400 double mitk::DICOMImageBlockDescriptor::stringtodouble(
const std::string& str )
const
403 std::string trimmedstring( str );
406 trimmedstring = trimmedstring.erase( trimmedstring.find_last_not_of(
" \n\r\t" ) + 1 );
413 std::string firstcomponent( trimmedstring );
416 firstcomponent = trimmedstring.erase( trimmedstring.find_first_of(
"\\" ) );
423 std::istringstream converter( firstcomponent );
424 if ( !firstcomponent.empty() && ( converter >> d ) && converter.eof() )
430 throw std::invalid_argument(
"Argument is not a convertable number" );
447 const char* propertyKeySliceLocation =
"dicom.image.0020.1041";
448 const char* propertyKeyInstanceNumber =
"dicom.image.0020.0013";
449 const char* propertyKeySOPInstanceUID =
"dicom.image.0008.0018";
451 mitkImage->SetProperty( propertyKeySliceLocation, this->GetProperty(
"sliceLocationForSlices" ) );
452 mitkImage->SetProperty( propertyKeyInstanceNumber, this->GetProperty(
"instanceNumberForSlices" ) );
453 mitkImage->SetProperty( propertyKeySOPInstanceUID, this->GetProperty(
"SOPInstanceUIDForSlices" ) );
454 mitkImage->SetProperty(
"files", this->GetProperty(
"filenamesForSlices" ) );
457 mitkImage->SetProperty(
"dicomseriesreader.SOPClassUID",
StringProperty::New( this->GetSOPClassUID() ) );
459 mitkImage->SetProperty(
"dicomseriesreader.SOPClass",
StringProperty::New( this->GetSOPClassUIDAsName() ) );
461 mitkImage->SetProperty(
462 "dicomseriesreader.PixelSpacingInterpretationString",
464 mitkImage->SetProperty(
465 "dicomseriesreader.PixelSpacingInterpretation",
468 mitkImage->SetProperty(
469 "dicomseriesreader.ReaderImplementationLevelString",
472 mitkImage->SetProperty(
"dicomseriesreader.ReaderImplementationLevel",
475 mitkImage->SetProperty(
"dicomseriesreader.GantyTiltCorrected",
478 mitkImage->SetProperty(
"dicomseriesreader.3D+t",
BoolProperty::New( this->GetFlag(
"3D+t",
false ) ) );
481 const std::string windowCenter = this->GetPropertyAsString(
"windowCenter" );
482 const std::string windowWidth = this->GetPropertyAsString(
"windowWidth" );
485 const double level = stringtodouble( windowCenter );
486 const double window = stringtodouble( windowWidth );
494 const std::string modality = this->GetPropertyAsString(
"modality" );
497 mitkImage->SetProperty(
"dicom.pixel.PhotometricInterpretation",
498 this->GetProperty(
"photometricInterpretation" ) );
499 mitkImage->SetProperty(
"dicom.image.imagetype", this->GetProperty(
"imagetype" ) );
501 mitkImage->SetProperty(
"dicom.study.StudyDescription", this->GetProperty(
"studyDescription" ) );
502 mitkImage->SetProperty(
"dicom.series.SeriesDescription", this->GetProperty(
"seriesDescription" ) );
504 mitkImage->SetProperty(
"dicom.pixel.Rows", this->GetProperty(
"rows" ) );
505 mitkImage->SetProperty(
"dicom.pixel.Columns", this->GetProperty(
"columns" ) );
509 for (
auto tag : m_FoundAdditionalTags)
511 BaseProperty* prop = this->GetProperty(tag);
514 mitkImage->SetProperty(tag.c_str(), prop);
525 m_ReaderImplementationLevel = level;
530 return m_ReaderImplementationLevel;
535 if ( !m_ImageFrameList.empty() && m_TagCache.IsNotNull() )
537 static const DICOMTag tagSOPClassUID( 0x0008, 0x0016 );
538 return m_TagCache->GetTagValue( m_ImageFrameList.front(), tagSOPClassUID ).value;
543 <<
"Invalid call to DICOMImageBlockDescriptor::GetSOPClassUID(). Need to have initialized tag-cache!";
544 return std::string(
"" );
550 if ( !m_ImageFrameList.empty() && m_TagCache.IsNotNull() )
552 gdcm::UIDs uidKnowledge;
553 uidKnowledge.SetFromUID( this->GetSOPClassUID().c_str() );
555 const char* name = uidKnowledge.GetName();
558 return std::string( name );
562 return std::string(
"" );
567 MITK_ERROR <<
"Invalid call to DICOMImageBlockDescriptor::GetSOPClassUIDAsName(). Need to have "
568 "initialized tag-cache!";
569 return std::string(
"" );
576 this->m_PropertyList->GetIntProperty(
"timesteps", result);
583 const int numberOfTimesteps = this->GetNumberOfTimeSteps();
584 int numberOfFramesPerTimestep = this->m_ImageFrameList.size() / numberOfTimesteps;
585 assert(
int(
double((
double)this->m_ImageFrameList.size() / (double)numberOfTimesteps))
586 == numberOfFramesPerTimestep);
588 return numberOfFramesPerTimestep;
595 m_TagCache = privateCache;
598 #define printPropertyRange( label, property_name ) \
601 const std::string first = this->GetPropertyAsString( #property_name "First" ); \
602 const std::string last = this->GetPropertyAsString( #property_name "Last" ); \
603 if ( !first.empty() || !last.empty() ) \
605 if ( first == last ) \
607 os << " " label ": '" << first << "'" << std::endl; \
611 os << " " label ": '" << first << "' - '" << last << "'" << std::endl; \
617 #define printProperty( label, property_name ) \
620 const std::string first = this->GetPropertyAsString( #property_name ); \
621 if ( !first.empty() ) \
623 os << " " label ": '" << first << "'" << std::endl; \
628 #define printBool( label, commands ) \
631 os << " " label ": '" << ( commands ? "yes" : "no" ) << "'" << std::endl; \
640 os <<
" Number of Frames: '" << m_ImageFrameList.size() <<
"'" << std::endl;
641 os <<
" SOP class: '" << this->GetSOPClassUIDAsName() <<
"'" << std::endl;
655 os <<
" Pixel spacing interpretation: '"
657 printBool(
"Gantry Tilt", this->GetTiltInformation().IsRegularGantryTilt() )
662 if ( filenameDetails )
664 os <<
" Files in this image block:" << std::endl;
665 for (
auto frameIter = m_ImageFrameList.begin(); frameIter != m_ImageFrameList.end(); ++frameIter )
667 os <<
" " << ( *frameIter )->Filename;
668 if ( ( *frameIter )->FrameNo > 0 )
670 os <<
", " << ( *frameIter )->FrameNo;
677 #define storeTagValueToProperty( tag_name, tag_g, tag_e ) \
680 const DICOMTag t( tag_g, tag_e ); \
681 const std::string tagValue = m_TagCache->GetTagValue( firstFrame, t ).value; \
682 const_cast<DICOMImageBlockDescriptor*>( this ) \
683 ->SetProperty( #tag_name, StringProperty::New( tagValue ) ); \
687 #define storeTagValueRangeToProperty( tag_name, tag_g, tag_e ) \
690 const DICOMTag t( tag_g, tag_e ); \
691 const std::string tagValueFirst = m_TagCache->GetTagValue( firstFrame, t ).value; \
692 const std::string tagValueLast = m_TagCache->GetTagValue( lastFrame, t ).value; \
693 const_cast<DICOMImageBlockDescriptor*>( this ) \
694 ->SetProperty( #tag_name "First", StringProperty::New( tagValueFirst ) ); \
695 const_cast<DICOMImageBlockDescriptor*>( this ) \
696 ->SetProperty( #tag_name "Last", StringProperty::New( tagValueLast ) ); \
701 void mitk::DICOMImageBlockDescriptor::UpdateImageDescribingProperties()
const
703 if ( !m_PropertiesOutOfDate )
706 if ( !m_ImageFrameList.empty() )
708 if ( m_TagCache.IsNull() )
710 MITK_ERROR <<
"Invalid call to DICOMImageBlockDescriptor::UpdateImageDescribingProperties(). Need to "
711 "have initialized tag-cache!";
745 StringLookupTable sliceLocationForSlices;
746 StringLookupTable instanceNumberForSlices;
747 StringLookupTable SOPInstanceUIDForSlices;
748 StringLookupTable filenamesForSlices;
750 const DICOMTag tagSliceLocation( 0x0020, 0x1041 );
751 const DICOMTag tagInstanceNumber( 0x0020, 0x0013 );
752 const DICOMTag tagSOPInstanceNumber( 0x0008, 0x0018 );
754 std::unordered_map<std::string, DICOMCachedValueLookupTable> additionalTagResultList;
756 unsigned int slice(0);
758 unsigned int zSlice(0);
759 const int framesPerTimeStep = this->GetNumberOfFramesPerTimeStep();
760 for (
auto frameIter = m_ImageFrameList.begin(); frameIter != m_ImageFrameList.end();
761 ++slice, ++frameIter )
763 zSlice = slice%framesPerTimeStep;
769 const std::string sliceLocation = m_TagCache->GetTagValue( *frameIter, tagSliceLocation ).value;
770 sliceLocationForSlices.SetTableValue( slice, sliceLocation );
772 const std::string instanceNumber = m_TagCache->GetTagValue( *frameIter, tagInstanceNumber ).value;
773 instanceNumberForSlices.SetTableValue( slice, instanceNumber );
775 const std::string sopInstanceUID = m_TagCache->GetTagValue( *frameIter, tagSOPInstanceNumber ).value;
776 SOPInstanceUIDForSlices.SetTableValue( slice, sopInstanceUID );
778 const std::string
filename = ( *frameIter )->Filename;
779 filenamesForSlices.SetTableValue( slice, filename );
781 MITK_DEBUG <<
"Tag info for slice " << slice <<
": SL '" << sliceLocation <<
"' IN '" << instanceNumber
782 <<
"' SOP instance UID '" << sopInstanceUID <<
"'";
784 for (
const auto& tag : m_AdditionalTagMap)
787 for (
const auto& finding : findings)
792 DICOMCachedValueInfo
info{
static_cast<unsigned int>(timePoint), zSlice, finding.value };
793 additionalTagResultList[propKey].SetTableValue(slice,
info);
800 DICOMImageBlockDescriptor* thisInstance =
const_cast<DICOMImageBlockDescriptor*
>( this );
801 thisInstance->SetProperty(
"sliceLocationForSlices",
804 thisInstance->SetProperty(
"instanceNumberForSlices",
807 thisInstance->SetProperty(
"SOPInstanceUIDForSlices",
815 for (
auto iter = additionalTagResultList.cbegin(); iter != additionalTagResultList.cend(); ++iter )
817 thisInstance->SetProperty( iter->first, m_PropertyFunctor( iter->second ) );
818 thisInstance->m_FoundAdditionalTags.insert(m_FoundAdditionalTags.cend(),iter->first);
821 m_PropertiesOutOfDate =
false;
827 mitk::DICOMImageBlockDescriptor::GetPropertyForDICOMValues(
const DICOMCachedValueLookupTable& cacheLookupTable)
829 const auto& lookupTable = cacheLookupTable.GetLookupTable();
830 typedef std::pair<int, DICOMCachedValueInfo> PairType;
831 if ( std::adjacent_find(
832 lookupTable.cbegin(),
834 [](
const PairType& lhs,
const PairType& rhs ) {
return lhs.second.Value != rhs.second.Value; } )
835 == lookupTable.cend() )
841 StringLookupTable stringTable;
842 for (
auto element : lookupTable)
844 stringTable.SetTableValue(element.first, element.second.Value);
854 if ( functor !=
nullptr )
856 m_PropertyFunctor = functor;
static DICOMTagList GetTagsOfInterest()
const DICOMImageFrameList & GetImageFrameList() const
List of frames that constitute the mitk::Image (DICOMImageFrames)
std::string GetSOPClassUID() const
SOP Class UID of this set of frames.
loader did not yet inspect any images, unknown fitness
itk::SmartPointer< Self > Pointer
void SetSpacing(const mitk::Vector3D &aSpacing, bool enforceSetSpacing=false)
Set the spacing (m_Spacing).
int GetIntProperty(const std::string &key, int defaultValue) const
Convenience function around GetProperty()
void SetIntProperty(const std::string &key, int value)
Convenience function around SetProperty()
ReaderImplementationLevel GetReaderImplementationLevel() const
Reader's capability to appropriately load this set of frames.
void SetTiltInformation(const GantryTiltInformation &info)
Describe the gantry tilt of the acquisition.
BaseProperty * GetProperty(const std::string &key) const
Key-value store describing aspects of the image to be loaded.
bool DICOMStringToSpacing(const std::string &s, ScalarType &spacingX, ScalarType &spacingY)
std::vector< DICOMTag > DICOMTagList
void SetAdditionalTagsOfInterest(const AdditionalTagsMapType &tagMap)
Set a list of DICOMTagPaths that specifiy all DICOM-Tags that will be copied into the property of the...
Representation of a DICOM tag.
NO spacing information is present, we use (1,1) as default.
DICOMImageBlockDescriptor & operator=(const DICOMImageBlockDescriptor &other)
std::string ReaderImplementationLevelToString(const ReaderImplementationLevel &enumValue)
Convert mitk::ReaderImplementationLevel to a human readable string.
#define printProperty(label, property_name)
const mitk::Vector3D GetSpacing() const
Get the spacing (size of a pixel).
const GantryTiltInformation GetTiltInformation() const
Describe the gantry tilt of the acquisition.
int GetNumberOfFramesPerTimeStep() const
Key-value list holding instances of BaseProperty.
#define printPropertyRange(label, property_name)
std::map< DICOMTagPath, std::string > AdditionalTagsMapType
#define storeTagValueRangeToProperty(tag_name, tag_g, tag_e)
static void info(const char *fmt,...)
std::function< mitk::BaseProperty::Pointer(const DICOMCachedValueLookupTable &) > TagLookupTableToPropertyFunctor
void SetImageFrameList(const DICOMImageFrameList &framelist)
List of frames that constitute the mitk::Image (DICOMImageFrames)
void SetMitkImage(Image::Pointer image)
The 3D mitk::Image that is loaded from the DICOM files of a DICOMImageFrameList.
MITKDICOMREADER_EXPORT std::string DICOMTagPathToPropertyName(const DICOMTagPath &tagPath)
void SetTagLookupTableToPropertyFunctor(TagLookupTableToPropertyFunctor)
Set a functor that defines how the slice-specific tag-values are stored in a Property.
ReaderImplementationLevel
Describes how well the reader is tested for a certain file type (see mitk::DICOMFileReader).
PixelSpacingInterpretation
How the mitk::Image spacing should be interpreted (see mitk::DICOMFileReader).
Abstract base class for properties.
PixelSpacingInterpretation GetPixelSpacingInterpretation() const
Describe how the mitk::Image's pixel spacing should be interpreted.
void SetReaderImplementationLevel(const ReaderImplementationLevel &level)
Reader's capability to appropriately load this set of frames.
static const std::string filename
std::vector< DICOMImageFrameInfo::Pointer > DICOMImageFrameList
std::string PixelSpacingInterpretationToString(const PixelSpacingInterpretation &value)
Convert mitk::PixelSpacingInterpretation to a human readable string.
std::string GetSOPClassUIDAsName() const
SOP Class as human readable name (e.g. "CT Image Storage")
int GetNumberOfTimeSteps() const
Image class for storing images.
bool GetFlag(const std::string &key, bool defaultValue) const
Convenience function around GetProperty()
void GetDesiredMITKImagePixelSpacing(ScalarType &spacingXinMM, ScalarType &spacingYinMM) const
Describe the correct x/y pixel spacing of the mitk::Image (which some readers might need to adjust af...
Output descriptor for DICOMFileReader.
void SetTagCache(DICOMTagCache *privateCache)
Image::Pointer GetMitkImage() const
the 3D mitk::Image that is loaded from the DICOM files of a DICOMImageFrameList
~DICOMImageBlockDescriptor()
void SetProperty(const std::string &key, BaseProperty *value)
Key-value store describing aspects of the image to be loaded.
void SetFlag(const std::string &key, bool value)
Convenience function around SetProperty()
std::string GetPropertyAsString(const std::string &) const
Convenience function around GetProperty()
std::list< DICOMDatasetFinding > FindingsListType
void Print(std::ostream &os, bool filenameDetails) const
Print information about this image block to given stream.
#define storeTagValueToProperty(tag_name, tag_g, tag_e)
mitk::BaseGeometry * GetGeometry(int t=0) const
Return the geometry, which is a TimeGeometry, of the data as non-const pointer.
DICOMImageBlockDescriptor()
distances are mm at detector surface
#define printBool(label, commands)
distances are mm within a patient
static itkEventMacro(BoundingShapeInteractionEvent, itk::AnyEvent) class MITKBOUNDINGSHAPE_EXPORT BoundingShapeInteractor Pointer New()
Basic interaction methods for mitk::GeometryData.