ENH: triSurface: unstructured ascii vtk reading

This commit is contained in:
mattijs
2012-03-05 14:13:31 +00:00
parent 5242bcf9b8
commit f0d680d4c0
10 changed files with 235 additions and 12 deletions

View File

@ -28,10 +28,10 @@ OSspecific/${WM_OSTYPE:-POSIX}/Allwmake
wmake $makeType OpenFOAM wmake $makeType OpenFOAM
wmake $makeType fileFormats wmake $makeType fileFormats
wmake $makeType surfMesh
wmake $makeType triSurface wmake $makeType triSurface
wmake $makeType meshTools wmake $makeType meshTools
wmake $makeType edgeMesh wmake $makeType edgeMesh
wmake $makeType surfMesh
# Decomposition methods needed by dummyThirdParty # Decomposition methods needed by dummyThirdParty
parallel/decompose/AllwmakeLnInclude parallel/decompose/AllwmakeLnInclude

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) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -63,6 +63,42 @@ PrimitivePatch
{} {}
template
<
class Face,
template<class> class FaceList,
class PointField,
class PointType
>
Foam::PrimitivePatch<Face, FaceList, PointField, PointType>::
PrimitivePatch
(
const Xfer<FaceList<Face> >& faces,
const Xfer<List<PointType> >& points
)
:
FaceList<Face>(faces),
points_(points),
edgesPtr_(NULL),
nInternalEdges_(-1),
boundaryPointsPtr_(NULL),
faceFacesPtr_(NULL),
edgeFacesPtr_(NULL),
faceEdgesPtr_(NULL),
pointEdgesPtr_(NULL),
pointFacesPtr_(NULL),
localFacesPtr_(NULL),
meshPointsPtr_(NULL),
meshPointMapPtr_(NULL),
edgeLoopsPtr_(NULL),
localPointsPtr_(NULL),
localPointOrderPtr_(NULL),
faceCentresPtr_(NULL),
faceNormalsPtr_(NULL),
pointNormalsPtr_(NULL)
{}
template template
< <
class Face, class Face,

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) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -243,6 +243,13 @@ public:
const Field<PointType>& points const Field<PointType>& points
); );
//- Construct from components
PrimitivePatch
(
const Xfer<FaceList<Face> >& faces,
const Xfer<List<PointType> >& points
);
//- Construct from components, reuse storage //- Construct from components, reuse storage
PrimitivePatch PrimitivePatch
( (

View File

@ -125,8 +125,11 @@ void Foam::vtkUnstructuredReader::extractCells
cells_.setSize(cellTypes.size()); cells_.setSize(cellTypes.size());
cellMap_.setSize(cellTypes.size(), -1);
faces_.setSize(cellTypes.size()); faces_.setSize(cellTypes.size());
faceMap_.setSize(cellTypes.size(), -1);
lines_.setSize(cellTypes.size()); lines_.setSize(cellTypes.size());
lineMap_.setSize(cellTypes.size(), -1);
label dataIndex = 0; label dataIndex = 0;
label cellI = 0; label cellI = 0;
@ -179,6 +182,7 @@ void Foam::vtkUnstructuredReader::extractCells
) << "Expected size 2 for VTK_LINE but found " ) << "Expected size 2 for VTK_LINE but found "
<< nRead << exit(FatalIOError); << nRead << exit(FatalIOError);
} }
lineMap_[lineI] = i;
labelList& segment = lines_[lineI++]; labelList& segment = lines_[lineI++];
segment.setSize(2); segment.setSize(2);
segment[0] = cellVertData[dataIndex++]; segment[0] = cellVertData[dataIndex++];
@ -190,6 +194,7 @@ void Foam::vtkUnstructuredReader::extractCells
{ {
//warnUnhandledType(inFile, cellTypes[i], warningGiven); //warnUnhandledType(inFile, cellTypes[i], warningGiven);
label nRead = cellVertData[dataIndex++]; label nRead = cellVertData[dataIndex++];
lineMap_[lineI] = i;
labelList& segment = lines_[lineI++]; labelList& segment = lines_[lineI++];
segment.setSize(nRead); segment.setSize(nRead);
forAll(segment, i) forAll(segment, i)
@ -201,6 +206,7 @@ void Foam::vtkUnstructuredReader::extractCells
case VTK_TRIANGLE: case VTK_TRIANGLE:
{ {
faceMap_[faceI] = i;
face& f = faces_[faceI++]; face& f = faces_[faceI++];
f.setSize(3); f.setSize(3);
label nRead = cellVertData[dataIndex++]; label nRead = cellVertData[dataIndex++];
@ -221,6 +227,7 @@ void Foam::vtkUnstructuredReader::extractCells
case VTK_QUAD: case VTK_QUAD:
{ {
faceMap_[faceI] = i;
face& f = faces_[faceI++]; face& f = faces_[faceI++];
f.setSize(4); f.setSize(4);
label nRead = cellVertData[dataIndex++]; label nRead = cellVertData[dataIndex++];
@ -242,6 +249,7 @@ void Foam::vtkUnstructuredReader::extractCells
case VTK_POLYGON: case VTK_POLYGON:
{ {
faceMap_[faceI] = i;
face& f = faces_[faceI++]; face& f = faces_[faceI++];
label nRead = cellVertData[dataIndex++]; label nRead = cellVertData[dataIndex++];
f.setSize(nRead); f.setSize(nRead);
@ -268,6 +276,7 @@ void Foam::vtkUnstructuredReader::extractCells
tetPoints[1] = cellVertData[dataIndex++]; tetPoints[1] = cellVertData[dataIndex++];
tetPoints[2] = cellVertData[dataIndex++]; tetPoints[2] = cellVertData[dataIndex++];
tetPoints[3] = cellVertData[dataIndex++]; tetPoints[3] = cellVertData[dataIndex++];
cellMap_[cellI] = i;
cells_[cellI++] = cellShape(tet, tetPoints, true); cells_[cellI++] = cellShape(tet, tetPoints, true);
} }
break; break;
@ -289,6 +298,7 @@ void Foam::vtkUnstructuredReader::extractCells
pyrPoints[2] = cellVertData[dataIndex++]; pyrPoints[2] = cellVertData[dataIndex++];
pyrPoints[3] = cellVertData[dataIndex++]; pyrPoints[3] = cellVertData[dataIndex++];
pyrPoints[4] = cellVertData[dataIndex++]; pyrPoints[4] = cellVertData[dataIndex++];
cellMap_[cellI] = i;
cells_[cellI++] = cellShape(pyr, pyrPoints, true); cells_[cellI++] = cellShape(pyr, pyrPoints, true);
} }
break; break;
@ -311,6 +321,7 @@ void Foam::vtkUnstructuredReader::extractCells
prismPoints[3] = cellVertData[dataIndex++]; prismPoints[3] = cellVertData[dataIndex++];
prismPoints[4] = cellVertData[dataIndex++]; prismPoints[4] = cellVertData[dataIndex++];
prismPoints[5] = cellVertData[dataIndex++]; prismPoints[5] = cellVertData[dataIndex++];
cellMap_[cellI] = i;
cells_[cellI++] = cellShape(prism, prismPoints, true); cells_[cellI++] = cellShape(prism, prismPoints, true);
} }
break; break;
@ -335,6 +346,7 @@ void Foam::vtkUnstructuredReader::extractCells
hexPoints[5] = cellVertData[dataIndex++]; hexPoints[5] = cellVertData[dataIndex++];
hexPoints[6] = cellVertData[dataIndex++]; hexPoints[6] = cellVertData[dataIndex++];
hexPoints[7] = cellVertData[dataIndex++]; hexPoints[7] = cellVertData[dataIndex++];
cellMap_[cellI] = i;
cells_[cellI++] = cellShape(hex, hexPoints, true); cells_[cellI++] = cellShape(hex, hexPoints, true);
} }
break; break;
@ -351,8 +363,11 @@ void Foam::vtkUnstructuredReader::extractCells
Info<< "Read " << cellI << " cells;" << faceI << " faces." << endl; Info<< "Read " << cellI << " cells;" << faceI << " faces." << endl;
} }
cells_.setSize(cellI); cells_.setSize(cellI);
cellMap_.setSize(cellI);
faces_.setSize(faceI); faces_.setSize(faceI);
faceMap_.setSize(faceI);
lines_.setSize(lineI); lines_.setSize(lineI);
lineMap_.setSize(lineI);
} }
@ -655,9 +670,11 @@ void Foam::vtkUnstructuredReader::read(ISstream& inFile)
labelList lineVerts; labelList lineVerts;
readBlock(inFile, nNumbers, lineVerts); readBlock(inFile, nNumbers, lineVerts);
lines_.setSize(nLines); lines_.setSize(nLines);
lineMap_.setSize(nLines);
label elemI = 0; label elemI = 0;
forAll(lines_, lineI) forAll(lines_, lineI)
{ {
lineMap_[lineI] = lineI;
labelList& f = lines_[lineI]; labelList& f = lines_[lineI];
f.setSize(lineVerts[elemI++]); f.setSize(lineVerts[elemI++]);
forAll(f, fp) forAll(f, fp)
@ -682,6 +699,7 @@ void Foam::vtkUnstructuredReader::read(ISstream& inFile)
label elemI = 0; label elemI = 0;
forAll(faces_, faceI) forAll(faces_, faceI)
{ {
faceMap_[faceI] = faceI;
face& f = faces_[faceI]; face& f = faces_[faceI];
f.setSize(faceVerts[elemI++]); f.setSize(faceVerts[elemI++]);
forAll(f, fp) forAll(f, fp)

View File

@ -25,7 +25,8 @@ Class
Foam::vtkUnstructuredReader Foam::vtkUnstructuredReader
Description Description
Reader for vtk unstructured legacy files Reader for vtk unstructured legacy files. Supports single CELLS, POINTS
etc. entry only.
SourceFiles SourceFiles
vtkUnstructuredReader.C vtkUnstructuredReader.C
@ -45,9 +46,6 @@ SourceFiles
namespace Foam namespace Foam
{ {
// Forward declaration of friend functions and operators
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class vtkUnstructuredReader Declaration Class vtkUnstructuredReader Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
@ -137,12 +135,20 @@ private:
//- 3D cells. //- 3D cells.
cellShapeList cells_; cellShapeList cells_;
//- Map from cells back to original ID
labelList cellMap_;
//- 2D cells (=faces) //- 2D cells (=faces)
faceList faces_; faceList faces_;
//- Map from faces back to original ID
labelList faceMap_;
//- 1D cells (=edges) //- 1D cells (=edges)
labelListList lines_; labelListList lines_;
labelList lineMap_;
// Data // Data
@ -258,6 +264,11 @@ public:
return cells_; return cells_;
} }
const labelList& cellMap() const
{
return cellMap_;
}
//- 2D cells (=faces) //- 2D cells (=faces)
const faceList& faces() const const faceList& faces() const
{ {
@ -269,6 +280,11 @@ public:
return faces_; return faces_;
} }
const labelList& faceMap() const
{
return faceMap_;
}
//- 1D cells (=open lines) //- 1D cells (=open lines)
const labelListList& lines() const const labelListList& lines() const
{ {
@ -280,6 +296,11 @@ public:
return lines_; return lines_;
} }
const labelList& lineMap() const
{
return lineMap_;
}
//- cell based fields //- cell based fields
const objectRegistry& cellData() const const objectRegistry& cellData() const
{ {

View File

@ -25,6 +25,7 @@ $(interfaces)/TRI/readTRI.C
$(interfaces)/DX/writeDX.C $(interfaces)/DX/writeDX.C
$(interfaces)/AC3D/readAC.C $(interfaces)/AC3D/readAC.C
$(interfaces)/AC3D/writeAC.C $(interfaces)/AC3D/writeAC.C
$(interfaces)/VTK/readVTK.C
$(interfaces)/VTK/writeVTK.C $(interfaces)/VTK/writeVTK.C
$(interfaces)/NAS/readNAS.C $(interfaces)/NAS/readNAS.C

View File

@ -1,5 +1,7 @@
EXE_INC = \ EXE_INC = \
-I$(LIB_SRC)/fileFormats/lnInclude -I$(LIB_SRC)/fileFormats/lnInclude \
-I$(LIB_SRC)/surfMesh/lnInclude
LIB_LIBS = \ LIB_LIBS = \
-lfileFormats -lfileFormats \
-lsurfMesh

View File

@ -0,0 +1,111 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2012 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM 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 General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "triSurface.H"
#include "VTKsurfaceFormat.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::triSurface::readVTK(const fileName& fName)
{
// Read (and triagulate) point, faces, zone info
fileFormats::VTKsurfaceFormat<triFace> surf(fName);
List<labelledTri> tris(surf.faces().size());
forAll(tris, i)
{
const triFace& f = surf[i];
tris[i] = labelledTri(f[0], f[1], f[2], 0);
}
// Add regions from zone
const List<surfZone>& surfZones = surf.surfZones();
geometricSurfacePatchList patches;
if (surfZones.size())
{
patches.setSize(surfZones.size());
forAll(surfZones, zoneI)
{
const surfZone& zone = surfZones[zoneI];
// Add patch. Convert synthetic 'zone' name into 'patch' for now.
// (vtk format does not contain region names)
word regionName = zone.name();
if (regionName != (string("zone") + name(zoneI)))
{
regionName = string("patch") + name(zoneI);
}
patches[zoneI] = geometricSurfacePatch
(
(
zone.geometricType() != word::null
? zone.geometricType()
: "empty"
),
regionName,
zoneI
);
// Set triangle regions
for (label i = zone.start(); i < zone.start()+zone.size(); i++)
{
tris[i].region() = zoneI;
}
}
}
else
{
// Add single patch
patches[0] = geometricSurfacePatch("empty", "patch0", 0);
// Triangle regions already set to 0
}
// Create triSurface
*this = triSurface
(
tris.xfer(),
patches,
xferCopy<List<point> >(surf.points())
);
return true;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* //

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) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -412,6 +412,10 @@ bool Foam::triSurface::read
{ {
return readNAS(name); return readNAS(name);
} }
else if (ext == "vtk")
{
return readVTK(name);
}
else else
{ {
FatalErrorIn FatalErrorIn
@ -419,7 +423,7 @@ bool Foam::triSurface::read
"triSurface::read(const fileName&, const word&)" "triSurface::read(const fileName&, const word&)"
) << "unknown file extension " << ext ) << "unknown file extension " << ext
<< ". Supported extensions are '.ftr', '.stl', '.stlb', '.gts'" << ". Supported extensions are '.ftr', '.stl', '.stlb', '.gts'"
<< ", '.obj', '.ac', '.off', '.nas' and '.tri'" << ", '.obj', '.ac', '.off', '.nas', '.tri' and '.vtk'"
<< exit(FatalError); << exit(FatalError);
return false; return false;
@ -639,6 +643,20 @@ Foam::triSurface::triSurface
{} {}
Foam::triSurface::triSurface
(
const Xfer<List<labelledTri> >& triangles,
const geometricSurfacePatchList& patches,
const Xfer<List<point> >& points
)
:
ParentType(triangles, points),
patches_(patches),
sortedEdgeFacesPtr_(NULL),
edgeOwnerPtr_(NULL)
{}
Foam::triSurface::triSurface Foam::triSurface::triSurface
( (
const List<labelledTri>& triangles, const List<labelledTri>& triangles,

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) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -131,6 +131,7 @@ class triSurface
bool readTRI(const fileName&); bool readTRI(const fileName&);
bool readAC(const fileName&); bool readAC(const fileName&);
bool readNAS(const fileName&); bool readNAS(const fileName&);
bool readVTK(const fileName&);
//- Generic write routine. Chooses writer based on extension. //- Generic write routine. Chooses writer based on extension.
void write(const fileName&, const word& ext, const bool sort) const; void write(const fileName&, const word& ext, const bool sort) const;
@ -258,6 +259,14 @@ public:
const bool reUse const bool reUse
); );
//- Construct from triangles, patches, points.
triSurface
(
const Xfer<List<labelledTri> >&,
const geometricSurfacePatchList&,
const Xfer<List<point> >&
);
//- Construct from triangles, points. Set patchnames to default. //- Construct from triangles, points. Set patchnames to default.
triSurface(const List<labelledTri>&, const pointField&); triSurface(const List<labelledTri>&, const pointField&);