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 #include "mitkPlanarFigureWriter.h"
00019 #include "mitkBasePropertySerializer.h"
00020
00021 #include <tinyxml.h>
00022
00023
00024 mitk::PlanarFigureWriter::PlanarFigureWriter()
00025 : m_FileName(""), m_FilePrefix(""), m_FilePattern(""), m_Extension(".pf"),
00026 m_MimeType("application/MITK.PlanarFigure"), m_Success(false)
00027 {
00028 this->SetNumberOfRequiredInputs( 1 );
00029 this->SetNumberOfOutputs( 0 );
00030
00031 }
00032
00033
00034 mitk::PlanarFigureWriter::~PlanarFigureWriter()
00035 {}
00036
00037
00038 void mitk::PlanarFigureWriter::GenerateData()
00039 {
00040 m_Success = false;
00041
00042 if (m_FileName.empty())
00043 {
00044 MITK_ERROR << "Could not write planar figures. File name is invalid";
00045 throw std::invalid_argument("file name is empty");
00046 }
00047
00048 TiXmlDocument document;
00049 TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );
00050 document.LinkEndChild( decl );
00051
00052 TiXmlElement* version = new TiXmlElement("Version");
00053 version->SetAttribute("Writer", __FILE__ );
00054 version->SetAttribute("CVSRevision", "$Revision: 17055 $" );
00055 version->SetAttribute("FileVersion", 1 );
00056 document.LinkEndChild(version);
00057
00058
00059
00060 for ( unsigned int i = 0 ; i < this->GetNumberOfInputs(); ++i )
00061 {
00062
00063 InputType::Pointer pf = this->GetInput( i );
00064 if (pf.IsNull())
00065 continue;
00066 TiXmlElement* pfElement = new TiXmlElement("PlanarFigure");
00067 pfElement->SetAttribute("type", pf->GetNameOfClass());
00068 document.LinkEndChild(pfElement);
00069
00070 PlanarFigure::VertexContainerType* vertices = pf->GetControlPoints();
00071 if (vertices == NULL)
00072 continue;
00073
00074
00075 mitk::PropertyList::Pointer propertyList = pf->GetPropertyList();
00076 mitk::PropertyList::PropertyMap::const_iterator it;
00077 for ( it = propertyList->GetMap()->begin(); it != propertyList->GetMap()->end(); ++it )
00078 {
00079
00080 const mitk::BaseProperty* prop = it->second.first;
00081 std::string serializerName = std::string( prop->GetNameOfClass() ) + "Serializer";
00082 std::list< itk::LightObject::Pointer > allSerializers = itk::ObjectFactoryBase::CreateAllInstance(
00083 serializerName.c_str() );
00084
00085 if ( allSerializers.size() != 1 )
00086 {
00087
00088 continue;
00089 }
00090
00091 mitk::BasePropertySerializer* serializer = dynamic_cast< mitk::BasePropertySerializer* >(
00092 allSerializers.begin()->GetPointer() );
00093 if ( serializer == NULL )
00094 {
00095
00096 }
00097
00098 TiXmlElement* keyElement = new TiXmlElement( "property" );
00099 keyElement->SetAttribute( "key", it->first );
00100 keyElement->SetAttribute( "type", prop->GetNameOfClass() );
00101
00102 serializer->SetProperty( prop );
00103 TiXmlElement* valueElement = NULL;
00104 try
00105 {
00106 valueElement = serializer->Serialize();
00107 }
00108 catch (...)
00109 {
00110 }
00111
00112 if ( valueElement == NULL )
00113 {
00114
00115 continue;
00116 }
00117
00118
00119 keyElement->LinkEndChild( valueElement );
00120
00121
00122 pfElement->LinkEndChild( keyElement );
00123 }
00124
00125
00126 TiXmlElement* controlPointsElement = new TiXmlElement("ControlPoints");
00127 pfElement->LinkEndChild(controlPointsElement);
00128 for (unsigned int i = 0; i < pf->GetNumberOfControlPoints(); i++)
00129 {
00130 TiXmlElement* vElement = new TiXmlElement("Vertex");
00131 vElement->SetAttribute("id", i);
00132 vElement->SetDoubleAttribute("x", pf->GetControlPoint(i)[0]);
00133 vElement->SetDoubleAttribute("y", pf->GetControlPoint(i)[1]);
00134 controlPointsElement->LinkEndChild(vElement);
00135 }
00136 TiXmlElement* geoElement = new TiXmlElement("Geometry");
00137 const PlaneGeometry* planeGeo = dynamic_cast<const PlaneGeometry*>(pf->GetGeometry2D());
00138 if (planeGeo != NULL)
00139 {
00140
00141 typedef mitk::AffineGeometryFrame3D::TransformType TransformType;
00142 const TransformType* affineGeometry = planeGeo->GetIndexToWorldTransform();
00143 const TransformType::ParametersType& parameters = affineGeometry->GetParameters();
00144 TiXmlElement* vElement = new TiXmlElement( "transformParam" );
00145 for ( unsigned int i = 0; i < affineGeometry->GetNumberOfParameters(); ++i )
00146 {
00147 std::stringstream paramName;
00148 paramName << "param" << i;
00149 vElement->SetDoubleAttribute( paramName.str().c_str(), parameters.GetElement( i ) );
00150 }
00151 geoElement->LinkEndChild( vElement );
00152
00153
00154 typedef mitk::Geometry3D::BoundsArrayType BoundsArrayType;
00155 const BoundsArrayType& bounds = planeGeo->GetBounds();
00156 vElement = new TiXmlElement( "boundsParam" );
00157 for ( unsigned int i = 0; i < 6; ++i )
00158 {
00159 std::stringstream boundName;
00160 boundName << "bound" << i;
00161 vElement->SetDoubleAttribute( boundName.str().c_str(), bounds.GetElement( i ) );
00162 }
00163 geoElement->LinkEndChild( vElement );
00164
00165
00166 Vector3D spacing = planeGeo->GetSpacing();
00167 Point3D origin = planeGeo->GetOrigin();
00168 geoElement->LinkEndChild(this->CreateXMLVectorElement("Spacing", spacing));
00169 geoElement->LinkEndChild(this->CreateXMLVectorElement("Origin", origin));
00170
00171 pfElement->LinkEndChild(geoElement);
00172 }
00173 }
00174
00175 if (document.SaveFile( m_FileName) == false)
00176 {
00177 MITK_ERROR << "Could not write planar figures to " << m_FileName << "\nTinyXML reports '" << document.ErrorDesc() << "'";
00178 throw std::ios_base::failure("Error during writing of planar figure xml file.");
00179 }
00180 m_Success = true;
00181 }
00182
00183
00184 TiXmlElement* mitk::PlanarFigureWriter::CreateXMLVectorElement(const char* name, itk::FixedArray<mitk::ScalarType, 3> v)
00185 {
00186 TiXmlElement* vElement = new TiXmlElement(name);
00187 vElement->SetDoubleAttribute("x", v.GetElement(0));
00188 vElement->SetDoubleAttribute("y", v.GetElement(1));
00189 vElement->SetDoubleAttribute("z", v.GetElement(2));
00190 return vElement;
00191 }
00192
00193
00194 void mitk::PlanarFigureWriter::ResizeInputs( const unsigned int& num )
00195 {
00196
00197 this->SetNumberOfInputs( num );
00198
00199
00200
00201
00202 }
00203
00204
00205 void mitk::PlanarFigureWriter::SetInput( InputType* PlanarFigure )
00206 {
00207 this->ProcessObject::SetNthInput( 0, PlanarFigure );
00208 }
00209
00210
00211 void mitk::PlanarFigureWriter::SetInput( const unsigned int& id, InputType* PlanarFigure )
00212 {
00213 if ( id >= this->GetNumberOfInputs() )
00214 this->ResizeInputs( id + 1 );
00215 this->ProcessObject::SetNthInput( id, PlanarFigure );
00216 }
00217
00218
00219 mitk::PlanarFigure* mitk::PlanarFigureWriter::GetInput()
00220 {
00221 if ( this->GetNumberOfInputs() < 1 )
00222 return NULL;
00223 else
00224 return dynamic_cast<InputType*> ( this->GetInput( 0 ) );
00225 }
00226
00227
00228 mitk::PlanarFigure* mitk::PlanarFigureWriter::GetInput( const unsigned int& num )
00229 {
00230 return dynamic_cast<InputType*> ( this->ProcessObject::GetInput( num ) );
00231 }
00232
00233
00234 bool mitk::PlanarFigureWriter::CanWriteDataType( DataNode* input )
00235 {
00236 if ( input == NULL )
00237 return false;
00238
00239 mitk::BaseData* data = input->GetData();
00240 if ( data == NULL)
00241 return false;
00242
00243 mitk::PlanarFigure::Pointer PlanarFigure = dynamic_cast<mitk::PlanarFigure*>( data );
00244 if( PlanarFigure.IsNull() )
00245 return false;
00246
00247 return true;
00248 }
00249
00250
00251 void mitk::PlanarFigureWriter::SetInput( DataNode* input )
00252 {
00253 if (this->CanWriteDataType(input))
00254 this->ProcessObject::SetNthInput( 0, dynamic_cast<mitk::PlanarFigure*>( input->GetData() ) );
00255 }
00256
00257
00258 std::string mitk::PlanarFigureWriter::GetWritenMIMEType()
00259 {
00260 return m_MimeType;
00261 }
00262
00263
00264 std::vector<std::string> mitk::PlanarFigureWriter::GetPossibleFileExtensions()
00265 {
00266 std::vector<std::string> possibleFileExtensions;
00267 possibleFileExtensions.push_back(m_Extension);
00268 return possibleFileExtensions;
00269 }
00270
00271
00272 std::string mitk::PlanarFigureWriter::GetFileExtension()
00273 {
00274 return m_Extension;
00275 }