ENH: vtkUnstructuredReader: read triangle strips

This commit is contained in:
mattijs
2013-09-13 09:24:38 +01:00
parent 5bb5b446db
commit 18d7152aed

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2012 OpenFOAM Foundation \\ / A nd | Copyright (C) 2012-2013 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -34,7 +34,7 @@ License
namespace Foam namespace Foam
{ {
defineTypeNameAndDebug(vtkUnstructuredReader, 0); defineTypeNameAndDebug(vtkUnstructuredReader, 1); //0);
template<> template<>
const char* const char*
@ -115,18 +115,19 @@ void Foam::vtkUnstructuredReader::extractCells
labelList prismPoints(6); labelList prismPoints(6);
labelList hexPoints(8); labelList hexPoints(8);
label cellI = cells_.size();
cells_.setSize(cellI+cellTypes.size());
cellMap_.setSize(cells_.size(), -1);
cells_.setSize(cellTypes.size()); label faceI = faces_.size();
cellMap_.setSize(cellTypes.size(), -1); faces_.setSize(faceI+cellTypes.size());
faces_.setSize(cellTypes.size()); faceMap_.setSize(faces_.size(), -1);
faceMap_.setSize(cellTypes.size(), -1);
lines_.setSize(cellTypes.size()); label lineI = lines_.size();
lineMap_.setSize(cellTypes.size(), -1); lines_.setSize(lineI+cellTypes.size());
lineMap_.setSize(lines_.size(), -1);
label dataIndex = 0; label dataIndex = 0;
label cellI = 0;
label faceI = 0;
label lineI = 0;
// To mark whether unhandled type has been visited. // To mark whether unhandled type has been visited.
@ -672,10 +673,13 @@ void Foam::vtkUnstructuredReader::read(ISstream& inFile)
} }
labelList lineVerts; labelList lineVerts;
readBlock(inFile, nNumbers, lineVerts); readBlock(inFile, nNumbers, lineVerts);
lines_.setSize(nLines);
lineMap_.setSize(nLines); label lineI = lines_.size();
lines_.setSize(lineI+nLines);
lineMap_.setSize(lines_.size());
label elemI = 0; label elemI = 0;
forAll(lines_, lineI) for (label i = 0; i < nLines; i++)
{ {
lineMap_[lineI] = lineI; lineMap_[lineI] = lineI;
labelList& f = lines_[lineI]; labelList& f = lines_[lineI];
@ -684,6 +688,7 @@ void Foam::vtkUnstructuredReader::read(ISstream& inFile)
{ {
f[fp] = lineVerts[elemI++]; f[fp] = lineVerts[elemI++];
} }
lineI++;
} }
} }
else if (tag == "POLYGONS") else if (tag == "POLYGONS")
@ -698,10 +703,13 @@ void Foam::vtkUnstructuredReader::read(ISstream& inFile)
} }
labelList faceVerts; labelList faceVerts;
readBlock(inFile, nNumbers, faceVerts); readBlock(inFile, nNumbers, faceVerts);
faces_.setSize(nFaces);
faceMap_.setSize(nFaces); label faceI = faces_.size();
faces_.setSize(faceI+nFaces);
faceMap_.setSize(faces_.size());
label elemI = 0; label elemI = 0;
forAll(faces_, faceI) for (label i = 0; i < nFaces; i++)
{ {
faceMap_[faceI] = faceI; faceMap_[faceI] = faceI;
face& f = faces_[faceI]; face& f = faces_[faceI];
@ -710,6 +718,7 @@ void Foam::vtkUnstructuredReader::read(ISstream& inFile)
{ {
f[fp] = faceVerts[elemI++]; f[fp] = faceVerts[elemI++];
} }
faceI++;
} }
} }
else if (tag == "POINT_DATA") else if (tag == "POINT_DATA")
@ -859,6 +868,56 @@ void Foam::vtkUnstructuredReader::read(ISstream& inFile)
scalarField coords(dim*points_.size()); scalarField coords(dim*points_.size());
readBlock(inFile, coords.size(), coords); readBlock(inFile, coords.size(), coords);
} }
else if (tag == "TRIANGLE_STRIPS")
{
label nStrips(readLabel(inFile));
label nNumbers(readLabel(inFile));
if (debug)
{
Info<< "Reading " << nStrips << " triangle strips." << endl;
}
labelList faceVerts;
readBlock(inFile, nNumbers, faceVerts);
// Count number of triangles
label elemI = 0;
label nTris = 0;
for (label i = 0; i < nStrips; i++)
{
label nVerts = faceVerts[elemI++];
nTris += nVerts-2;
elemI += nVerts;
}
// Store
label faceI = faces_.size();
faces_.setSize(faceI+nTris);
faceMap_.setSize(faces_.size());
elemI = 0;
for (label i = 0; i < nStrips; i++)
{
label nVerts = faceVerts[elemI++];
label nTris = nVerts-2;
// Read first triangle
faceMap_[faceI] = faceI;
face& f = faces_[faceI++];
f.setSize(3);
f[0] = faceVerts[elemI++];
f[1] = faceVerts[elemI++];
f[2] = faceVerts[elemI++];
for (label triI = 1; triI < nTris; triI++)
{
faceMap_[faceI] = faceI;
face& f = faces_[faceI++];
f.setSize(3);
f[0] = faceVerts[elemI-1];
f[1] = faceVerts[elemI-2];
f[2] = faceVerts[elemI++];
}
}
}
else else
{ {
FatalIOErrorIn("vtkUnstructuredReader::read(..)", inFile) FatalIOErrorIn("vtkUnstructuredReader::read(..)", inFile)