/*============================================================================ MetaIO Copyright 2000-2010 Insight Software Consortium Distributed under the OSI-approved BSD License (the "License"); see accompanying file Copyright.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more information. ============================================================================*/ #ifdef _MSC_VER #pragma warning(disable:4702) #pragma warning(disable:4284) #endif #include "metaLine.h" #include #include #include #if (METAIO_USE_NAMESPACE) namespace METAIO_NAMESPACE { #endif LinePnt:: LinePnt(int dim) { m_Dim = dim; m_X = new float[m_Dim]; m_V = new float*[m_Dim-1]; for(unsigned int i=0;irequired = true; m_Fields.push_back(mF); mF = new MET_FieldRecordType; MET_InitReadField(mF, "Points", MET_NONE, true); mF->terminateRead = true; m_Fields.push_back(mF); } void MetaLine:: M_SetupWriteFields(void) { strcpy(m_ObjectTypeName,"Line"); MetaObject::M_SetupWriteFields(); MET_FieldRecordType * mF; char s[255]; mF = new MET_FieldRecordType; MET_TypeToString(m_ElementType, s); MET_InitWriteField(mF, "ElementType", MET_STRING, strlen(s), s); m_Fields.push_back(mF); if(strlen(m_PointDim)>0) { mF = new MET_FieldRecordType; MET_InitWriteField(mF, "PointDim", MET_STRING, strlen(m_PointDim),m_PointDim); m_Fields.push_back(mF); } m_NPoints = (int)m_PointList.size(); mF = new MET_FieldRecordType; MET_InitWriteField(mF, "NPoints", MET_INT,m_NPoints); m_Fields.push_back(mF); mF = new MET_FieldRecordType; MET_InitWriteField(mF, "Points", MET_NONE); m_Fields.push_back(mF); } MET_ValueEnumType MetaLine:: ElementType(void) const { return m_ElementType; } void MetaLine:: ElementType(MET_ValueEnumType _elementType) { m_ElementType = _elementType; } bool MetaLine:: M_Read(void) { if(META_DEBUG) METAIO_STREAM::cout << "MetaLine: M_Read: Loading Header" << METAIO_STREAM::endl; if(!MetaObject::M_Read()) { METAIO_STREAM::cout << "MetaLine: M_Read: Error parsing file" << METAIO_STREAM::endl; return false; } if(META_DEBUG) METAIO_STREAM::cout << "MetaLine: M_Read: Parsing Header" << METAIO_STREAM::endl; MET_FieldRecordType * mF; mF = MET_GetFieldRecord("NPoints", &m_Fields); if(mF->defined) { m_NPoints= (int)mF->value[0]; } mF = MET_GetFieldRecord("ElementType", &m_Fields); if(mF->defined) { MET_StringToType((char *)(mF->value), &m_ElementType); } mF = MET_GetFieldRecord("PointDim", &m_Fields); if(mF->defined) { strcpy(m_PointDim,(char *)(mF->value)); } int pntDim; char** pntVal = NULL; MET_StringToWordArray(m_PointDim, &pntDim, &pntVal); int ii; for(ii=0;iiread((char *)_data, readSize); int gc = static_cast(m_ReadStream->gcount()); if(gc != readSize) { METAIO_STREAM::cout << "MetaLine: m_Read: data not read completely" << METAIO_STREAM::endl; METAIO_STREAM::cout << " ideal = " << readSize << " : actual = " << gc << METAIO_STREAM::endl; delete [] _data; return false; } int i=0; int d; unsigned int k; for(int j=0; jm_X[d] = (float)td; } for(int l=0;lm_V[l][d] = (float)td; } } for(d=0; d<4; d++) { float td; char * const num = (char *)(&td); for(k=0;km_Color[d] = (float)td; } m_PointList.push_back(pnt); } delete [] _data; } else { for(int j=0; j> v[k]; m_ReadStream->get(); } //float* x = new float[m_NDims]; for(d=0; dm_X[d] = v[d]; } //pnt.m_X = x; for(k=0; k> v[jj]; m_ReadStream->get(); } //float* n = new float[m_NDims]; for(d=0; dm_V[k][d] = v[d]; } //pnt.m_V[k] = n; } for(k=0; k<4; k++) { *m_ReadStream >> v[k]; m_ReadStream->get(); pnt->m_Color[k] = v[k]; } m_PointList.push_back(pnt); } char c = ' '; while( (c!='\n') && (!m_ReadStream->eof())) { c = static_cast(m_ReadStream->get());// to avoid unrecognized characters } } return true; } bool MetaLine:: M_Write(void) { if(!MetaObject::M_Write()) { METAIO_STREAM::cout << "MetaLine: M_Read: Error parsing file" << METAIO_STREAM::endl; return false; } /** Then copy all points */ if(m_BinaryData) { PointListType::const_iterator it = m_PointList.begin(); PointListType::const_iterator itEnd = m_PointList.end(); int elementSize; MET_SizeOfType(m_ElementType, &elementSize); char* data = new char[(m_NDims*m_NDims+4)*m_NPoints*elementSize]; int i=0; int d; while(it != itEnd) { for(d = 0; d < m_NDims; d++) { float pntX = (*it)->m_X[d]; MET_SwapByteIfSystemMSB(&pntX,MET_FLOAT); MET_DoubleToValue((double)pntX,m_ElementType,data,i++); } for(int j=0;jm_V[j][d]; MET_SwapByteIfSystemMSB(&v,MET_FLOAT); MET_DoubleToValue((double)v,m_ElementType,data,i++); } } for(d=0; d<4; d++) { float c = (*it)->m_Color[d]; MET_SwapByteIfSystemMSB(&c,MET_FLOAT); MET_DoubleToValue((double)c,m_ElementType,data,i++); } ++it; } m_WriteStream->write((char *)data,(m_NDims*m_NDims+4)*m_NPoints*elementSize); m_WriteStream->write("\n",1); delete [] data; } else { PointListType::const_iterator it = m_PointList.begin(); PointListType::const_iterator itEnd = m_PointList.end(); int d; while(it != itEnd) { for(d = 0; d < m_NDims; d++) { *m_WriteStream << (*it)->m_X[d] << " "; } for(d = 0; d < m_NDims-1; d++) { for(int i = 0; i < m_NDims; i++) { *m_WriteStream << (*it)->m_V[d][i] << " "; } } for(d=0;d<4;d++) { *m_WriteStream << (*it)->m_Color[d] << " "; } *m_WriteStream << METAIO_STREAM::endl; ++it; } } return true; } #if (METAIO_USE_NAMESPACE) }; #endif