/*
* Copyright (C) 2008-2012 Thorsten Liebig (Thorsten.Liebig@gmx.de)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include "tinyxml.h"
#include "stdint.h"
#include
#include
#include
#include
#include "CSPrimPolyhedronReader.h"
#include "CSProperties.h"
#include "CSUseful.h"
CSPrimPolyhedronReader::CSPrimPolyhedronReader(ParameterSet* paraSet, CSProperties* prop): CSPrimPolyhedron(paraSet,prop)
{
Type = POLYHEDRONREADER;
PrimTypeName = "PolyhedronReader";
m_filetype = UNKNOWN;
m_filename = std::string();
}
CSPrimPolyhedronReader::CSPrimPolyhedronReader(CSPrimPolyhedronReader* primPHReader, CSProperties *prop) : CSPrimPolyhedron(primPHReader, prop)
{
Type = POLYHEDRONREADER;
PrimTypeName = "PolyhedronReader";
m_filename = primPHReader->m_filename;
m_filetype = primPHReader->m_filetype;
}
CSPrimPolyhedronReader::CSPrimPolyhedronReader(unsigned int ID, ParameterSet* paraSet, CSProperties* prop) : CSPrimPolyhedron(ID, paraSet, prop)
{
Type = POLYHEDRONREADER;
PrimTypeName = "PolyhedronReader";
m_filetype = UNKNOWN;
m_filename = std::string();
}
CSPrimPolyhedronReader::~CSPrimPolyhedronReader()
{
}
bool CSPrimPolyhedronReader::Update(std::string *ErrStr)
{
return CSPrimPolyhedron::Update(ErrStr);
}
bool CSPrimPolyhedronReader::Write2XML(TiXmlElement &elem, bool parameterised)
{
elem.SetAttribute("Filename",m_filename);
switch (m_filetype)
{
case STL_FILE:
elem.SetAttribute("FileType","STL");
break;
case PLY_FILE:
elem.SetAttribute("FileType","PLY");
break;
default:
elem.SetAttribute("FileType","Unknown");
break;
}
return CSPrimitives::Write2XML(elem,parameterised);
}
bool CSPrimPolyhedronReader::ReadFromXML(TiXmlNode &root)
{
if (!CSPrimitives::ReadFromXML(root)) return false;
TiXmlElement* elem=root.ToElement();
if (elem==NULL) return false;
if (elem->QueryStringAttribute("FileName",&m_filename)!=TIXML_SUCCESS)
{
std::cerr << "CSPrimPolyhedronReader::ReadFromXML: Error, can't read filename!" << std::endl;
return false;
}
std::string type;
if (elem->QueryStringAttribute("FileType",&type)!=TIXML_SUCCESS)
{
std::cerr << "CSPrimPolyhedronReader::ReadFromXML: Error, can't read file type!" << std::endl;
return false;
}
if (type.compare("STL")==0)
m_filetype=STL_FILE;
else if (type.compare("PLY")==0)
m_filetype=PLY_FILE;
else
m_filetype=UNKNOWN;
if (ReadFile()==false)
{
std::cerr << "CSPrimPolyhedronReader::ReadFromXML: Failed to read file." << std::endl;
return false;
}
return BuildTree();
}
bool CSPrimPolyhedronReader::ReadFile()
{
vtkPolyData *polydata = NULL;
switch (m_filetype)
{
case STL_FILE:
{
vtkSTLReader* reader = vtkSTLReader::New();
reader->SetFileName(m_filename.c_str());
reader->SetMerging(1);
polydata = reader->GetOutput(0);
reader->Update();
break;
}
case PLY_FILE:
{
vtkPLYReader* reader = vtkPLYReader::New();
reader->SetFileName(m_filename.c_str());
polydata = reader->GetOutput(0);
reader->Update();
break;
}
case UNKNOWN:
default:
{
std::cerr << "CSPrimPolyhedronReader::ReadFile: unknown filetype, skipping..." << std::endl;
return false;
break;
}
}
//polydata->Update(); // not availabe for vtk 6.x, now done only on reader?
if ((polydata->GetNumberOfPoints()==0) || (polydata->GetNumberOfCells()==0))
{
std::cerr << "CSPrimPolyhedronReader::ReadFile: file invalid or empty, skipping ..." << std::endl;
return false;
}
vtkCellArray *verts = polydata->GetPolys();
if (verts->GetNumberOfCells()==0)
{
std::cerr << "CSPrimPolyhedronReader::ReadFile: file invalid or empty, skipping ..." << std::endl;
return false;
}
for (int n=0;nGetNumberOfPoints();++n)
AddVertex(polydata->GetPoint(n));
vtkIdType numP;
vtkIdType *vertices = new vtkIdType[10];
while (verts->GetNextCell(numP, vertices))
{
face f;
f.numVertex=numP;
f.vertices = new int[f.numVertex];
for (unsigned int np=0;np