/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd. ------------------------------------------------------------------------------- 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 . Application surfaceAdd Group grpSurfaceUtilities Description Add two surfaces. Does geometric merge on points. Does not check for overlapping/intersecting triangles. Keeps patches separate by renumbering. \*---------------------------------------------------------------------------*/ #include "argList.H" #include "fileName.H" #include "triSurface.H" #include "OFstream.H" #include "IFstream.H" #include "triFace.H" #include "triFaceList.H" using namespace Foam; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) { argList::addNote ( "add two surfaces via a geometric merge on points." ); argList::noParallel(); argList::validArgs.append("surfaceFile"); argList::validArgs.append("surfaceFile"); argList::validArgs.append("output surfaceFile"); argList::addOption ( "points", "file", "provide additional points" ); argList::addBoolOption ( "mergeRegions", "combine regions from both surfaces" ); argList args(argc, argv); const fileName inFileName1 = args[1]; const fileName inFileName2 = args[2]; const fileName outFileName = args[3]; const bool addPoint = args.optionFound("points"); const bool mergeRegions = args.optionFound("mergeRegions"); if (addPoint) { Info<< "Reading a surface and adding points from a file" << "; merging the points and writing the surface to another file" << nl << endl; Info<< "Surface : " << inFileName1<< nl << "Points : " << args["points"] << nl << "Writing : " << outFileName << nl << endl; } else { Info<< "Reading two surfaces" << "; merging points and writing the surface to another file" << nl << endl; if (mergeRegions) { Info<< "Regions from the two files will get merged" << nl << "Do not use this option if you want to keep the regions" << " separate" << nl << endl; } else { Info<< "Regions from the two files will not get merged" << nl << "Regions from " << inFileName2 << " will get offset so" << " as not to overlap with the regions in " << inFileName1 << nl << endl; } Info<< "Surface1 : " << inFileName1<< nl << "Surface2 : " << inFileName2<< nl << "Writing : " << outFileName << nl << endl; } const triSurface surface1(inFileName1); Info<< "Surface1:" << endl; surface1.writeStats(Info); Info<< endl; const pointField& points1 = surface1.points(); // Final surface triSurface combinedSurf; if (addPoint) { IFstream pointsFile(args["points"]); pointField extraPoints(pointsFile); Info<< "Additional Points:" << extraPoints.size() << endl; vectorField pointsAll(points1); label pointi = pointsAll.size(); pointsAll.setSize(pointsAll.size() + extraPoints.size()); forAll(extraPoints, i) { pointsAll[pointi++] = extraPoints[i]; } combinedSurf = triSurface(surface1, surface1.patches(), pointsAll); } else { const triSurface surface2(inFileName2); Info<< "Surface2:" << endl; surface2.writeStats(Info); Info<< endl; // Make new storage List facesAll(surface1.size() + surface2.size()); const pointField& points2 = surface2.points(); vectorField pointsAll(points1.size() + points2.size()); label pointi = 0; // Copy points1 into pointsAll forAll(points1, point1i) { pointsAll[pointi++] = points1[point1i]; } // Add surface2 points forAll(points2, point2i) { pointsAll[pointi++] = points2[point2i]; } label trianglei = 0; // Determine map for both regions label nNewPatches = 0; labelList patch1Map(surface1.patches().size()); labelList patch2Map(surface2.patches().size()); if (mergeRegions) { HashTable