Forward compatibility: flex
[foam-extend-3.2.git] / applications / utilities / mesh / generation / cfMesh / FMSToSurface / FMSToSurface.C
bloba4a617c3eb952a38b108c797cad330e748e8083a
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Description
25     Creates surface patches from surface subsets
27 \*---------------------------------------------------------------------------*/
29 #include "argList.H"
30 #include "objectRegistry.H"
31 #include "foamTime.H"
32 #include "triSurf.H"
33 #include "triSurfaceCopyParts.H"
34 #include "demandDrivenData.H"
35 #include "OFstream.H"
37 using namespace Foam;
39 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
41 void exportFeatureEdges
43     const triSurf& origSurf,
44     const fileName& edgeFileName
47     OFstream file(edgeFileName);
49     const pointField& points = origSurf.points();
50     labelList newPointLabel(points.size(), -1);
51     label nPoints(0);
53     const edgeLongList& featureEdges = origSurf.featureEdges();
54     forAll(featureEdges, feI)
55     {
56         const edge& e = featureEdges[feI];
58         if( newPointLabel[e[0]] == -1 )
59             newPointLabel[e[0]] = nPoints++;
60         if( newPointLabel[e[1]] == -1 )
61             newPointLabel[e[1]] = nPoints++;
62     }
64     pointField pCopy(nPoints);
65     forAll(newPointLabel, pI)
66     {
67         if( newPointLabel[pI] < 0 )
68             continue;
70         pCopy[newPointLabel[pI]] = points[pI];
71     }
73     //- write the header
74     file << "# vtk DataFile Version 3.0\n";
75     file << "vtk output\n";
76     file << "ASCII\n";
77     file << "DATASET POLYDATA\n";
79     //- write points
80     file << "POINTS " << pCopy.size() << " float\n";
81     forAll(pCopy, pI)
82     {
83         const point& p = pCopy[pI];
84         file << p.x() << ' ' << p.y() << ' ' << p.z() << '\n';
85     }
87     file << "\nLINES " << featureEdges.size()
88          << ' ' << 3*featureEdges.size() << nl;
89     forAll(featureEdges, edgeI)
90     {
91         const edge& e = featureEdges[edgeI];
92         file << "2 " << newPointLabel[e[0]]
93              << token::SPACE << newPointLabel[e[1]] << nl;
94     }
95     file << nl;
97     if( !file )
98         FatalErrorIn
99         (
100             "void exportFeatureEdges(const triSurf&, const fileName&)"
101         ) << "Writting of feature edges failed!" << exit(FatalError);
104 int main(int argc, char *argv[])
106     argList::noParallel();
107     argList::validArgs.clear();
109     argList::validArgs.append("input surface file");
110     argList::validArgs.append("output surface file");
111     argList::validOptions.insert("exportSubsets", "");
112     argList::validOptions.insert("exportFeatureEdges", "");
113     argList args(argc, argv);
115     fileName inFileName(args.args()[1]);
116     fileName outFileName(args.args()[2]);
118     fileName outFileNoExt = outFileName.lessExt();
119     fileName outExtension = outFileName.ext();
121     Info << "Out file no ext " << outFileNoExt << endl;
122     Info << "Extension " << outExtension << endl;
124     //- read the inout surface
125     triSurf origSurf(inFileName);
127     //- write the surface in the requated format
128     origSurf.writeSurface(outFileName);
130     //- export surface subsets as separate surface meshes
131     if( args.options().found("exportSubsets") )
132     {
133         DynList<label> subsetIDs;
134         origSurf.facetSubsetIndices(subsetIDs);
136         triSurfaceCopyParts copyParts(origSurf);
138         forAll(subsetIDs, subsetI)
139         {
140             //- get the name of the subset
141             triSurf copySurf;
142             wordList subsetName(1);
143             subsetName[0] = origSurf.facetSubsetName(subsetIDs[subsetI]);
145             //- create a surface mesh corresponding to the subset
146             copyParts.copySurface(subsetName, copySurf);
148             //- write the mesh on disk
149             fileName fName = outFileNoExt+"_facetSubset_"+subsetName[0];
150             fName += '.'+outExtension;
152             copySurf.writeSurface(fName);
153         }
154     }
156     if( args.options().found("exportFeatureEdges") )
157     {
158         fileName fName = outFileNoExt+"_featureEdges";
159         fName += ".vtk";
160         exportFeatureEdges(origSurf, fName);
161     }
163     Info << "End\n" << endl;
164     return 0;
167 // ************************************************************************* //