reads xml representations of mitk::PlanarFigure from a file More...
#include <mitkPlanarFigureReader.h>


Public Types | |
| typedef PlanarFigureReader | Self |
| typedef FileReader | Superclass |
| typedef itk::SmartPointer< Self > | Pointer |
| typedef itk::SmartPointer < const Self > | ConstPointer |
Public Member Functions | |
| virtual const char * | GetClassName () const |
| virtual void | SetFileName (const char *_arg) |
| Sets the filename of the file to be read. | |
| virtual const char * | GetFileName () const |
| Returns the filename of the point set xml-file. | |
| virtual void | SetFilePrefix (const char *_arg) |
| virtual const char * | GetFilePrefix () const |
| virtual void | SetFilePattern (const char *_arg) |
| virtual const char * | GetFilePattern () const |
| virtual bool | GetSuccess () const |
| virtual DataObjectPointer | MakeOutput (unsigned int idx) |
Static Public Member Functions | |
| static Pointer | New () |
| static bool | CanReadFile (const std::string filename, const std::string filePrefix, const std::string filePattern) |
Protected Types | |
| typedef std::list< double > | DoubleList |
Protected Member Functions | |
| PlanarFigureReader () | |
| virtual | ~PlanarFigureReader () |
| virtual void | GenerateData () |
| virtual void | GenerateOutputInformation () |
| virtual void | ResizeOutputs (const unsigned int &num) |
| virtual int | CanReadFile (const char *name) |
| mitk::Vector3D | GetVectorFromXMLNode (TiXmlElement *e) |
| parses the element for the attributes x,y,z and returns a mitk::Vector3D filled with these values | |
| mitk::Point3D | GetPointFromXMLNode (TiXmlElement *e) |
| parses the element for the attributes x,y,z and returns a mitk::Point3D filled with these values | |
| DoubleList | GetDoubleAttributeListFromXMLNode (TiXmlElement *e, const char *attributeNameBase, unsigned int count) |
| parses the element for the attributes name0 to nameN, where "name" and the number of attributes to read are passed as argument. Returns a list of double vales. | |
Protected Attributes | |
| std::string | m_FileName |
| std::string | m_FilePrefix |
| std::string | m_FilePattern |
| bool | m_Success |
reads xml representations of mitk::PlanarFigure from a file
Reader for xml files containing one or multiple xml represenations of mitk::PlanarFigure. If multiple mitk::PlanarFigure are stored in one file, these are assigned to multiple outputs of the filter.
Definition at line 40 of file mitkPlanarFigureReader.h.
| typedef itk::SmartPointer<const Self> mitk::PlanarFigureReader::ConstPointer |
Reimplemented from mitk::PlanarFigureSource.
Definition at line 44 of file mitkPlanarFigureReader.h.
typedef std::list< double > mitk::PlanarFigureReader::DoubleList [protected] |
Definition at line 97 of file mitkPlanarFigureReader.h.
| typedef itk::SmartPointer<Self> mitk::PlanarFigureReader::Pointer |
Reimplemented from mitk::PlanarFigureSource.
Definition at line 44 of file mitkPlanarFigureReader.h.
Reimplemented from mitk::PlanarFigureSource.
Definition at line 44 of file mitkPlanarFigureReader.h.
Reimplemented from mitk::PlanarFigureSource.
Definition at line 44 of file mitkPlanarFigureReader.h.
| mitk::PlanarFigureReader::PlanarFigureReader | ( | ) | [protected] |
Constructor
Definition at line 37 of file mitkPlanarFigureReader.cpp.
References MakeOutput(), and mitk::BaseProcess::SetNthOutput().
: PlanarFigureSource(), FileReader(), m_FileName(""), m_FilePrefix(""), m_FilePattern(""), m_Success(false) { this->SetNumberOfRequiredOutputs(1); this->SetNumberOfOutputs(1); this->SetNthOutput(0, this->MakeOutput(0)); //this->Modified(); //this->GetOutput()->Modified(); //this->GetOutput()->ReleaseData(); }
| mitk::PlanarFigureReader::~PlanarFigureReader | ( | ) | [protected, virtual] |
| bool mitk::PlanarFigureReader::CanReadFile | ( | const std::string | filename, |
| const std::string | filePrefix, | ||
| const std::string | filePattern | ||
| ) | [static] |
Definition at line 376 of file mitkPlanarFigureReader.cpp.
{
if (filename.empty())
return false;
return (itksys::SystemTools::LowerCase(itksys::SystemTools::GetFilenameLastExtension(filename)) == ".pf"); //assume, we can read all .pf files
//TiXmlDocument document(filename);
//if (document.LoadFile() == false)
// return false;
//return (document.FirstChildElement("PlanarFigure") != NULL);
}
| int mitk::PlanarFigureReader::CanReadFile | ( | const char * | name ) | [protected, virtual] |
Checks if the given file has appropriate read access.
Definition at line 363 of file mitkPlanarFigureReader.cpp.
{
if (std::string(name).empty())
return false;
return (itksys::SystemTools::LowerCase(itksys::SystemTools::GetFilenameLastExtension(name)) == ".pf"); //assume, we can read all .pf files
//TiXmlDocument document(name);
//if (document.LoadFile() == false)
// return false;
//return (document.FirstChildElement("PlanarFigure") != NULL);
}
| void mitk::PlanarFigureReader::GenerateData | ( | ) | [protected, virtual] |
Actually reads the point sets from the given file
Definition at line 61 of file mitkPlanarFigureReader.cpp.
References TiXmlDocument::ErrorCol(), TiXmlDocument::ErrorDesc(), TiXmlDocument::ErrorRow(), TiXmlNode::FirstChildElement(), TiXmlDocument::LoadFile(), MITK_ERROR, MITK_WARN, mitk::PlaneGeometry::New(), mitk::PlanarArrow::New(), mitk::PlanarRectangle::New(), mitk::PlanarPolygon::New(), mitk::PlanarLine::New(), mitk::PlanarFourPointAngle::New(), mitk::PlanarCross::New(), mitk::PlanarCircle::New(), mitk::PlanarAngle::New(), TiXmlNode::NextSiblingElement(), TiXmlElement::QueryIntAttribute(), TIXML_SUCCESS, and TIXML_WRONG_TYPE.
{
m_Success = false;
this->SetNumberOfOutputs(0); // reset all outputs, we add new ones depending on the file content
if (m_FileName.empty())
{
itkWarningMacro( << "Sorry, filename has not been set!" );
return;
}
if (this->CanReadFile( m_FileName.c_str()) == false)
{
itkWarningMacro( << "Sorry, can't read file " << m_FileName << "!" );
return;
}
TiXmlDocument document( m_FileName);
if (!document.LoadFile())
{
MITK_ERROR << "Could not open/read/parse " << m_FileName << ". TinyXML reports: '" << document.ErrorDesc() << "'. "
<< "The error occurred in row " << document.ErrorRow() << ", column " << document.ErrorCol() << ".";
return;
}
int fileVersion = 1;
TiXmlElement* versionObject = document.FirstChildElement("Version");
if (versionObject != NULL)
{
if ( versionObject->QueryIntAttribute( "FileVersion", &fileVersion ) != TIXML_SUCCESS )
{
MITK_WARN << m_FileName << " does not contain version information! Trying version 1 format." << std::endl;
}
}
else
{
MITK_WARN << m_FileName << " does not contain version information! Trying version 1 format." << std::endl;
}
if (fileVersion != 1) // add file version selection and version specific file parsing here, if newer file versions are created
{
MITK_WARN << "File version > 1 is not supported by this reader.";
return;
}
/* file version 1 reader code */
for( TiXmlElement* pfElement = document.FirstChildElement("PlanarFigure");
pfElement != NULL;
pfElement = pfElement->NextSiblingElement("PlanarFigure") )
{
if (pfElement == NULL)
continue;
std::string type = pfElement->Attribute("type");
mitk::PlanarFigure::Pointer planarFigure = NULL;
if (type == "PlanarAngle")
{
planarFigure = mitk::PlanarAngle::New();
}
else if (type == "PlanarCircle")
{
planarFigure = mitk::PlanarCircle::New();
}
else if (type == "PlanarCross")
{
planarFigure = mitk::PlanarCross::New();
}
else if (type == "PlanarFourPointAngle")
{
planarFigure = mitk::PlanarFourPointAngle::New();
}
else if (type == "PlanarLine")
{
planarFigure = mitk::PlanarLine::New();
}
else if (type == "PlanarPolygon")
{
planarFigure = mitk::PlanarPolygon::New();
}
else if (type == "PlanarRectangle")
{
planarFigure = mitk::PlanarRectangle::New();
}
else if (type == "PlanarArrow")
{
planarFigure = mitk::PlanarArrow::New();
}
else
{
// unknown type
MITK_WARN << "encountered unknown planar figure type '" << type << "'. Skipping this element.";
continue;
}
// Read properties of the planar figure
for( TiXmlElement* propertyElement = pfElement->FirstChildElement("property");
propertyElement != NULL;
propertyElement = propertyElement->NextSiblingElement("property") )
{
const char* keya = propertyElement->Attribute("key");
std::string key( keya ? keya : "");
const char* typea = propertyElement->Attribute("type");
std::string type( typea ? typea : "");
// hand propertyElement to specific reader
std::stringstream propertyDeserializerClassName;
propertyDeserializerClassName << type << "Deserializer";
std::list<itk::LightObject::Pointer> readers =
itk::ObjectFactoryBase::CreateAllInstance(propertyDeserializerClassName.str().c_str());
if (readers.size() < 1)
{
MITK_ERROR << "No property reader found for " << type;
}
if (readers.size() > 1)
{
MITK_WARN << "Multiple property readers found for " << type << ". Using arbitrary first one.";
}
for ( std::list<itk::LightObject::Pointer>::iterator iter = readers.begin();
iter != readers.end();
++iter )
{
if (BasePropertyDeserializer* reader = dynamic_cast<BasePropertyDeserializer*>( iter->GetPointer() ) )
{
BaseProperty::Pointer property = reader->Deserialize( propertyElement->FirstChildElement() );
if (property.IsNotNull())
{
planarFigure->GetPropertyList()->ReplaceProperty(key, property);
}
else
{
MITK_ERROR << "There were errors while loading property '" << key << "' of type " << type << ". Your data may be corrupted";
}
break;
}
}
}
// Read geometry of containing plane
TiXmlElement* geoElement = pfElement->FirstChildElement("Geometry");
if (geoElement != NULL)
{
try
{
// Create plane geometry
mitk::PlaneGeometry::Pointer planeGeo = mitk::PlaneGeometry::New();
// Extract and set plane transform parameters
DoubleList transformList = this->GetDoubleAttributeListFromXMLNode( geoElement->FirstChildElement( "transformParam" ), "param", 12 );
typedef mitk::AffineGeometryFrame3D::TransformType TransformType;
TransformType::ParametersType parameters;
parameters.SetSize( 12 );
unsigned int i;
DoubleList::iterator it;
for ( it = transformList.begin(), i = 0;
it != transformList.end();
++it, ++i )
{
parameters.SetElement( i, *it );
}
typedef mitk::AffineGeometryFrame3D::TransformType TransformType;
TransformType::Pointer affineGeometry = TransformType::New();
affineGeometry->SetParameters( parameters );
planeGeo->SetIndexToWorldTransform( affineGeometry );
// Extract and set plane bounds
DoubleList boundsList = this->GetDoubleAttributeListFromXMLNode( geoElement->FirstChildElement( "boundsParam" ), "bound", 6 );
typedef mitk::Geometry3D::BoundsArrayType BoundsArrayType;
BoundsArrayType bounds;
for ( it = boundsList.begin(), i = 0;
it != boundsList.end();
++it, ++i )
{
bounds[i] = *it;
}
planeGeo->SetBounds( bounds );
// Extract and set spacing and origin
Vector3D spacing = this->GetVectorFromXMLNode(geoElement->FirstChildElement("Spacing"));
planeGeo->SetSpacing( spacing );
Point3D origin = this->GetPointFromXMLNode(geoElement->FirstChildElement("Origin"));
planeGeo->SetOrigin( origin );
planarFigure->SetGeometry2D(planeGeo);
}
catch (...)
{
}
}
TiXmlElement* cpElement = pfElement->FirstChildElement("ControlPoints");
bool first = true;
if (cpElement != NULL)
for( TiXmlElement* vertElement = cpElement->FirstChildElement("Vertex"); vertElement != NULL; vertElement = vertElement->NextSiblingElement("Vertex"))
{
if (vertElement == NULL)
continue;
int id = 0;
mitk::Point2D::ValueType x = 0.0;
mitk::Point2D::ValueType y = 0.0;
if (vertElement->QueryIntAttribute("id", &id) == TIXML_WRONG_TYPE)
return; // TODO: can we do a better error handling?
if (vertElement->QueryFloatAttribute("x", &x) == TIXML_WRONG_TYPE)
return; // TODO: can we do a better error handling?
if (vertElement->QueryFloatAttribute("y", &y) == TIXML_WRONG_TYPE)
return; // TODO: can we do a better error handling?
Point2D p;
p.SetElement(0, x);
p.SetElement(1, y);
if (first == true) // needed to set m_FigurePlaced to true
{
planarFigure->PlaceFigure(p);
first = false;
}
planarFigure->SetControlPoint(id, p, true);
}
// Calculate feature quantities of this PlanarFigure
planarFigure->EvaluateFeatures();
// Make sure that no control point is currently selected
planarFigure->DeselectControlPoint();
// \TODO: what about m_FigurePlaced and m_SelectedControlPoint ??
this->SetNthOutput( this->GetNumberOfOutputs(), planarFigure ); // add planarFigure as new output of this filter
}
m_Success = true;
}
| void mitk::PlanarFigureReader::GenerateOutputInformation | ( | void | ) | [protected, virtual] |
Does nothing in the current implementation
Definition at line 359 of file mitkPlanarFigureReader.cpp.
{
}
| virtual const char* mitk::PlanarFigureReader::GetClassName | ( | ) | const [virtual] |
Reimplemented from mitk::PlanarFigureSource.
| mitk::PlanarFigureReader::DoubleList mitk::PlanarFigureReader::GetDoubleAttributeListFromXMLNode | ( | TiXmlElement * | e, |
| const char * | attributeNameBase, | ||
| unsigned int | count | ||
| ) | [protected] |
parses the element for the attributes name0 to nameN, where "name" and the number of attributes to read are passed as argument. Returns a list of double vales.
| [in] | e | the TiXmlElement that will be parsed |
| [in] | attributeNameBase | the basic name of the parameters |
| [in] | count | the number of parameters |
Definition at line 337 of file mitkPlanarFigureReader.cpp.
References TiXmlElement::QueryFloatAttribute(), and TIXML_WRONG_TYPE.
{
DoubleList list;
if (e == NULL)
throw std::invalid_argument("node invalid"); // TODO: can we do a better error handling?
for ( unsigned int i = 0; i < count; ++i )
{
mitk::ScalarType p(-1.0);
std::stringstream attributeName;
attributeName << attributeNameBase << i;
if (e->QueryFloatAttribute( attributeName.str().c_str(), &p ) == TIXML_WRONG_TYPE)
throw std::invalid_argument("node malformatted"); // TODO: can we do a better error handling?
list.push_back( p );
}
return list;
}
| virtual const char* mitk::PlanarFigureReader::GetFileName | ( | ) | const [virtual] |
Returns the filename of the point set xml-file.
Implements mitk::FileReader.
| virtual const char* mitk::PlanarFigureReader::GetFilePattern | ( | ) | const [virtual] |
Implements mitk::FileReader.
| virtual const char* mitk::PlanarFigureReader::GetFilePrefix | ( | ) | const [virtual] |
Implements mitk::FileReader.
| mitk::Point3D mitk::PlanarFigureReader::GetPointFromXMLNode | ( | TiXmlElement * | e ) | [protected] |
parses the element for the attributes x,y,z and returns a mitk::Point3D filled with these values
| [in] | e | the TiXmlElement that will be parsed |
Definition at line 299 of file mitkPlanarFigureReader.cpp.
References TiXmlElement::QueryFloatAttribute(), and TIXML_WRONG_TYPE.
{
if (e == NULL)
throw std::invalid_argument("node invalid"); // TODO: can we do a better error handling?
mitk::Point3D point;
mitk::ScalarType p(-1.0);
if (e->QueryFloatAttribute("x", &p) == TIXML_WRONG_TYPE)
throw std::invalid_argument("node malformatted"); // TODO: can we do a better error handling?
point.SetElement(0, p);
if (e->QueryFloatAttribute("y", &p) == TIXML_WRONG_TYPE)
throw std::invalid_argument("node malformatted"); // TODO: can we do a better error handling?
point.SetElement(1, p);
if (e->QueryFloatAttribute("z", &p) == TIXML_WRONG_TYPE)
throw std::invalid_argument("node malformatted"); // TODO: can we do a better error handling?
point.SetElement(2, p);
return point;
}
| virtual bool mitk::PlanarFigureReader::GetSuccess | ( | ) | const [virtual] |
| mitk::Vector3D mitk::PlanarFigureReader::GetVectorFromXMLNode | ( | TiXmlElement * | e ) | [protected] |
parses the element for the attributes x,y,z and returns a mitk::Vector3D filled with these values
| [in] | e | the TiXmlElement that will be parsed |
Definition at line 318 of file mitkPlanarFigureReader.cpp.
References TiXmlElement::QueryFloatAttribute(), and TIXML_WRONG_TYPE.
{
if (e == NULL)
throw std::invalid_argument("node invalid"); // TODO: can we do a better error handling?
mitk::Vector3D vector;
mitk::ScalarType p(-1.0);
if (e->QueryFloatAttribute("x", &p) == TIXML_WRONG_TYPE)
throw std::invalid_argument("node malformatted"); // TODO: can we do a better error handling?
vector.SetElement(0, p);
if (e->QueryFloatAttribute("y", &p) == TIXML_WRONG_TYPE)
throw std::invalid_argument("node malformatted"); // TODO: can we do a better error handling?
vector.SetElement(1, p);
if (e->QueryFloatAttribute("z", &p) == TIXML_WRONG_TYPE)
throw std::invalid_argument("node malformatted"); // TODO: can we do a better error handling?
vector.SetElement(2, p);
return vector;
}
| mitk::PlanarFigureSource::DataObjectPointer mitk::PlanarFigureReader::MakeOutput | ( | unsigned int | idx ) | [virtual] |
Allocates a new dummy output object and returns it. GenerateData() will overwrite the outputs with specific types,
| idx | the index of the output for which an object should be created |
Reimplemented from mitk::PlanarFigureSource.
Definition at line 55 of file mitkPlanarFigureReader.cpp.
References mitk::PlanarCircle::New().
Referenced by PlanarFigureReader().
{
return static_cast<itk::DataObject*>(PlanarCircle::New().GetPointer()); // just as a stand in for the pipeline update mechanism. This will be overwritten in GenerateData()
}
| static Pointer mitk::PlanarFigureReader::New | ( | ) | [static] |
Reimplemented from mitk::PlanarFigureSource.
Referenced by PlanarFigureIOTestClass::DeserializePlanarFigures().
| void mitk::PlanarFigureReader::ResizeOutputs | ( | const unsigned int & | num ) | [protected, virtual] |
Resizes the output-objects according to the given number.
| num | the new number of output objects. |
Definition at line 389 of file mitkPlanarFigureReader.cpp.
{
unsigned int prevNum = this->GetNumberOfOutputs();
this->SetNumberOfOutputs( num );
for ( unsigned int i = prevNum; i < num; ++i )
{
this->SetNthOutput( i, this->MakeOutput( i ).GetPointer() );
}
}
| virtual void mitk::PlanarFigureReader::SetFileName | ( | const char * | _arg ) | [virtual] |
Sets the filename of the file to be read.
| _arg | the filename of the point set xml-file |
Implements mitk::FileReader.
| virtual void mitk::PlanarFigureReader::SetFilePattern | ( | const char * | _arg ) | [virtual] |
Implements mitk::FileReader.
| virtual void mitk::PlanarFigureReader::SetFilePrefix | ( | const char * | _arg ) | [virtual] |
Implements mitk::FileReader.
std::string mitk::PlanarFigureReader::m_FileName [protected] |
Definition at line 158 of file mitkPlanarFigureReader.h.
std::string mitk::PlanarFigureReader::m_FilePattern [protected] |
Definition at line 160 of file mitkPlanarFigureReader.h.
std::string mitk::PlanarFigureReader::m_FilePrefix [protected] |
Definition at line 159 of file mitkPlanarFigureReader.h.
bool mitk::PlanarFigureReader::m_Success [protected] |
Definition at line 161 of file mitkPlanarFigureReader.h.
1.7.2