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 "vtkPointSetXMLParser.h"
00019 #include "vtkObjectFactory.h"
00020 #include "mitkPointSetWriter.h"
00021 #include "mitkOperation.h"
00022 #include "mitkInteractionConst.h"
00023 #include "mitkPointOperation.h"
00024
00025 namespace mitk
00026 {
00027 vtkStandardNewMacro(vtkPointSetXMLParser);
00028 }
00029
00030 mitk::vtkPointSetXMLParser::vtkPointSetXMLParser()
00031 {
00032 }
00033
00034 mitk::vtkPointSetXMLParser::~vtkPointSetXMLParser()
00035 {
00036 }
00037
00038 int mitk::vtkPointSetXMLParser::InitializeParser()
00039 {
00040 vtkXMLParser::InitializeParser();
00041 std::istream* stream = this -> GetStream();
00042 if (!stream)
00043 {
00044 vtkErrorMacro("no stream available in XML file reader");
00045 this->ParseError = 1;
00046 return 0;
00047 }
00048 m_PreviousLocale = stream->getloc();
00049 std::locale I("C");
00050 stream->imbue(I);
00051 return 1;
00052 }
00053
00054 int mitk::vtkPointSetXMLParser::CleanupParser()
00055 {
00056 std::istream* stream = this -> GetStream();
00057 if (!stream)
00058 {
00059 vtkErrorMacro("no stream available in XML file reader");
00060 this->ParseError = 1;
00061 return 0;
00062 }
00063 stream->imbue( m_PreviousLocale );
00064 vtkXMLParser::CleanupParser();
00065 return 1;
00066 }
00067
00068
00069
00070 void mitk::vtkPointSetXMLParser::StartElement ( const char *name, const char ** )
00071 {
00072 std::string currentElement = name;
00073
00074
00075
00076
00077 if ( currentElement == mitk::PointSetWriter::XML_POINT_SET )
00078 {
00079 m_CurrentPointSet = PointSetType::New();
00080 }
00081
00082
00083
00084 else if ( currentElement == mitk::PointSetWriter::XML_POINT )
00085 {
00086 m_CurrentPoint[ 0 ] = 0.0f;
00087 m_CurrentPoint[ 1 ] = 0.0f;
00088 m_CurrentPoint[ 2 ] = 0.0f;
00089 m_CurId.clear();
00090 m_CurXString.clear();
00091 m_CurYString.clear();
00092 m_CurZString.clear();
00093 }
00094
00095
00096
00097
00098
00099 m_ParseStack.push( currentElement );
00100 }
00101
00102
00103
00104
00105 void mitk::vtkPointSetXMLParser::EndElement ( const char *name )
00106 {
00107 std::string currentElement = name;
00108
00109
00110
00111
00112
00113 if ( m_ParseStack.top() != currentElement )
00114 {
00115 MITK_ERROR << "Top of parse stack ( " << m_ParseStack.top() << " ) is != currentEndElement ( " << currentElement << " )!" << std::endl;
00116 }
00117 m_ParseStack.pop();
00118
00119
00120
00121
00122
00123
00124
00125 if (currentElement == mitk::PointSetWriter::XML_POINT_SET)
00126 {
00127 m_CurrentPointSet->UpdateOutputInformation();
00128 m_PointSetList.push_back( m_CurrentPointSet );
00129 }
00130
00131
00132
00133
00134 else if ( currentElement == mitk::PointSetWriter::XML_POINT )
00135 {
00136 m_CurrentPointId = ParsePointIdentifier( m_CurId );
00137 m_CurrentPoint[ 0 ] = ParseScalarType( m_CurXString );
00138 m_CurrentPoint[ 1 ] = ParseScalarType( m_CurYString );
00139 m_CurrentPoint[ 2 ] = ParseScalarType( m_CurZString );
00140
00141 mitk::PointOperation popInsert( mitk::OpINSERT, m_CurrentPoint, m_CurrentPointId );
00142 mitk::PointOperation popDeactivate( mitk::OpDESELECTPOINT, m_CurrentPoint, m_CurrentPointId );
00143 assert( m_CurrentPointSet.IsNotNull() );
00144 m_CurrentPointSet->ExecuteOperation( &popInsert );
00145 m_CurrentPointSet->ExecuteOperation( &popDeactivate );
00146 }
00147 }
00148
00149
00150
00151
00152 void mitk::vtkPointSetXMLParser::CharacterDataHandler ( const char *inData, int inLength )
00153 {
00154 std::string currentElement = m_ParseStack.top();
00155 if ( currentElement == mitk::PointSetWriter::XML_ID )
00156 {
00157 m_CurId.append( inData, inLength );
00158 }
00159 else if ( currentElement == mitk::PointSetWriter::XML_X )
00160 {
00161 m_CurXString.append(inData, inLength);
00162 }
00163 else if ( currentElement == mitk::PointSetWriter::XML_Y )
00164 {
00165 m_CurYString.append(inData, inLength);
00166 }
00167 else if ( currentElement == mitk::PointSetWriter::XML_Z )
00168 {
00169 m_CurZString.append(inData, inLength);
00170 }
00171 }
00172
00173
00174
00175
00176 mitk::ScalarType mitk::vtkPointSetXMLParser::ParseScalarType( const std::string &data )
00177 {
00178 std::istringstream stm;
00179 stm.str(data);
00180 ScalarType number;
00181 stm >>number;
00182 return number;
00183 }
00184
00185
00186
00187
00188 mitk::vtkPointSetXMLParser::PointIdentifier mitk::vtkPointSetXMLParser::ParsePointIdentifier( const std::string &data )
00189 {
00190 std::istringstream stm;
00191 stm.str(data);
00192 PointIdentifier pointID;
00193 stm >>pointID;
00194 return pointID;
00195 }
00196
00197
00198
00199
00200 mitk::vtkPointSetXMLParser::PointSetList mitk::vtkPointSetXMLParser::GetParsedPointSets()
00201 {
00202 return m_PointSetList;
00203 }
00204
00205
00206