/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. \\/ 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 2 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, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA \*---------------------------------------------------------------------------*/ #include "STLsurfaceFormat.H" #include "ListOps.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // template inline void Foam::fileFormats::STLsurfaceFormat::writeShell ( Ostream& os, const pointField& pointLst, const Face& f, const vector& norm ) { // simple triangulation about f[0]. // better triangulation should have been done before const point& p0 = pointLst[f[0]]; for (label fp1 = 1; fp1 < f.size() - 1; ++fp1) { label fp2 = (fp1 + 1) % f.size(); const point& p1 = pointLst[f[fp1]]; const point& p2 = pointLst[f[fp2]]; // write STL triangle os << " facet normal " << norm.x() << ' ' << norm.y() << ' ' << norm.z() << nl << " outer loop\n" << " vertex " << p0.x() << ' ' << p0.y() << ' ' << p0.z() << nl << " vertex " << p1.x() << ' ' << p1.y() << ' ' << p1.z() << nl << " vertex " << p2.x() << ' ' << p2.y() << ' ' << p2.z() << nl << " endloop\n" << " endfacet" << endl; } } template inline void Foam::fileFormats::STLsurfaceFormat::writeShell ( ostream& os, const pointField& pointLst, const Face& f, const vector& norm, const label regionI ) { // simple triangulation about f[0]. // better triangulation should have been done before const point& p0 = pointLst[f[0]]; for (label fp1 = 1; fp1 < f.size() - 1; ++fp1) { label fp2 = (fp1 + 1) % f.size(); STLtriangle stlTri ( norm, p0, pointLst[f[fp1]], pointLst[f[fp2]], regionI ); stlTri.write(os); } } // write sorted: template void Foam::fileFormats::STLsurfaceFormat::writeASCII ( Ostream& os, const MeshedSurface& surf ) { const pointField& pointLst = surf.points(); const List& faceLst = surf.faces(); const List& regionLst = surf.regions(); const vectorField& normLst = surf.faceNormals(); label faceIndex = 0; forAll(regionLst, regionI) { // Print all faces belonging to this region const surfRegion& reg = regionLst[regionI]; os << "solid " << reg.name() << endl; forAll(reg, localFaceI) { const label faceI = faceIndex++; writeShell(os, pointLst, faceLst[faceI], normLst[faceI]); } os << "endsolid " << reg.name() << endl; } } // write sorted: template void Foam::fileFormats::STLsurfaceFormat::writeASCII ( Ostream& os, const UnsortedMeshedSurface& surf ) { const pointField& pointLst = surf.points(); const List& faceLst = surf.faces(); const vectorField& normLst = surf.faceNormals(); if (surf.regionToc().size() == 1) { // a single region - we can skip sorting os << "solid " << surf.regionToc()[0].name() << endl; forAll(faceLst, faceI) { writeShell(os, pointLst, faceLst[faceI], normLst[faceI]); } os << "endsolid " << surf.regionToc()[0].name() << endl; } else { labelList faceMap; List regionLst = surf.sortedRegions(faceMap); label faceIndex = 0; forAll(regionLst, regionI) { // Print all faces belonging to this region const surfRegion& reg = regionLst[regionI]; os << "solid " << reg.name() << endl; forAll(reg, localFaceI) { const label faceI = faceMap[faceIndex++]; writeShell(os, pointLst, faceLst[faceI], normLst[faceI]); } os << "endsolid " << reg.name() << endl; } } } template void Foam::fileFormats::STLsurfaceFormat::writeBINARY ( ostream& os, const MeshedSurface& surf ) { const pointField& pointLst = surf.points(); const List& faceLst = surf.faces(); const vectorField& normLst = surf.faceNormals(); const List& regionLst = surf.regions(); unsigned int nTris = 0; if (surf.isTri()) { nTris = faceLst.size(); } else { // count triangles for on-the-fly triangulation forAll(faceLst, faceI) { nTris += faceLst[faceI].size() - 2; } } // Write the STL header STLsurfaceFormatCore::writeHeaderBINARY(os, nTris); label faceIndex = 0; forAll(regionLst, regionI) { forAll(regionLst[regionI], regionFaceI) { writeShell ( os, pointLst, faceLst[faceIndex], normLst[faceIndex], regionI ); ++faceIndex; } } } // write unsorted: template void Foam::fileFormats::STLsurfaceFormat::writeBINARY ( ostream& os, const UnsortedMeshedSurface& surf ) { const pointField& pointLst = surf.points(); const List& faceLst = surf.faces(); const List