BUG: UListIO: byteSize overflowing on really big faceLists
[OpenFOAM-2.0.x.git] / applications / utilities / surface / surfaceMeshExport / surfaceMeshExport.C
blobc9b7d621135dfa2e51837934ebff6bd444166a39
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 Application
25     surfaceMeshExport
27 Description
28     Export from surfMesh to various third-party surface formats with
29     optional scaling or transformations (rotate/translate) on a
30     coordinateSystem.
32 Usage
33     - surfaceMeshExport outputFile [OPTION]
35     \param -clean \n
36     Perform some surface checking/cleanup on the input surface.
38     \param -name \<name\> \n
39     Specify an alternative surface name when writing.
41     \param -scaleIn \<scale\> \n
42     Specify a scaling factor when reading files.
44     \param -scaleOut \<scale\> \n
45     Specify a scaling factor when writing files.
47     \param -dict \<dictionary\> \n
48     Specify an alternative dictionary for constant/coordinateSystems.
50     \param -from \<coordinateSystem\> \n
51     Specify a coordinate system when reading files.
53     \param -to \<coordinateSystem\> \n
54     Specify a coordinate system when writing files.
56 Note
57     The filename extensions are used to determine the file format type.
59 \*---------------------------------------------------------------------------*/
61 #include "argList.H"
62 #include "timeSelector.H"
63 #include "Time.H"
65 #include "MeshedSurfaces.H"
66 #include "coordinateSystems.H"
68 using namespace Foam;
70 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
71 //  Main program:
73 int main(int argc, char *argv[])
75     argList::addNote
76     (
77         "export from surfMesh to various third-party surface formats"
78     );
80     argList::noParallel();
81     argList::validArgs.append("outputFile");
83     argList::addBoolOption
84     (
85         "clean",
86         "perform some surface checking/cleanup on the input surface"
87     );
88     argList::addOption
89     (
90         "name",
91         "name",
92         "specify an alternative surface name when reading - "
93         "default is 'default'"
94     );
95     argList::addOption
96     (
97         "scaleIn",
98         "factor",
99         "geometry scaling factor on input - default is 1"
100     );
101     argList::addOption
102     (
103         "scaleOut",
104         "factor",
105         "geometry scaling factor on output - default is 1"
106     );
107     argList::addOption
108     (
109         "dict",
110         "file",
111         "specify an alternative dictionary for constant/coordinateSystems"
112     );
113     argList::addOption
114     (
115         "from",
116         "coordinateSystem",
117         "specify the source coordinate system, applied after '-scaleIn'"
118     );
119     argList::addOption
120     (
121         "to",
122         "coordinateSystem",
123         "specify the target coordinate system, applied before '-scaleOut'"
124     );
126     argList args(argc, argv);
127     Time runTime(args.rootPath(), args.caseName());
129     const fileName exportName = args[1];
130     const word importName = args.optionLookupOrDefault<word>("name", "default");
132     // check that writing is supported
133     if (!MeshedSurface<face>::canWriteType(exportName.ext(), true))
134     {
135         return 1;
136     }
139     // get the coordinate transformations
140     autoPtr<coordinateSystem> fromCsys;
141     autoPtr<coordinateSystem> toCsys;
143     if (args.optionFound("from") || args.optionFound("to"))
144     {
145         autoPtr<IOobject> ioPtr;
147         if (args.optionFound("dict"))
148         {
149             const fileName dictPath = args["dict"];
151             ioPtr.set
152             (
153                 new IOobject
154                 (
155                     (
156                         isDir(dictPath)
157                       ? dictPath/coordinateSystems::typeName
158                       : dictPath
159                     ),
160                     runTime,
161                     IOobject::MUST_READ,
162                     IOobject::NO_WRITE,
163                     false
164                 )
165             );
166         }
167         else
168         {
169             ioPtr.set
170             (
171                 new IOobject
172                 (
173                     coordinateSystems::typeName,
174                     runTime.constant(),
175                     runTime,
176                     IOobject::MUST_READ,
177                     IOobject::NO_WRITE,
178                     false
179                 )
180             );
181         }
184         if (!ioPtr->headerOk())
185         {
186             FatalErrorIn(args.executable())
187                 << "Cannot open coordinateSystems file\n    "
188                 << ioPtr->objectPath() << nl
189                 << exit(FatalError);
190         }
192         coordinateSystems csLst(ioPtr());
194         if (args.optionFound("from"))
195         {
196             const word csName = args["from"];
198             const label csIndex = csLst.findIndex(csName);
199             if (csIndex < 0)
200             {
201                 FatalErrorIn(args.executable())
202                     << "Cannot find -from " << csName << nl
203                     << "available coordinateSystems: " << csLst.toc() << nl
204                     << exit(FatalError);
205             }
207             fromCsys.reset(new coordinateSystem(csLst[csIndex]));
208         }
210         if (args.optionFound("to"))
211         {
212             const word csName = args["to"];
214             const label csIndex = csLst.findIndex(csName);
215             if (csIndex < 0)
216             {
217                 FatalErrorIn(args.executable())
218                     << "Cannot find -to " << csName << nl
219                     << "available coordinateSystems: " << csLst.toc() << nl
220                     << exit(FatalError);
221             }
223             toCsys.reset(new coordinateSystem(csLst[csIndex]));
224         }
227         // maybe fix this later
228         if (fromCsys.valid() && toCsys.valid())
229         {
230             FatalErrorIn(args.executable())
231                 << "Only allowed  '-from' or '-to' option at the moment."
232                 << exit(FatalError);
233         }
234     }
237     surfMesh smesh
238     (
239         IOobject
240         (
241             importName,
242             runTime.constant(),
243             runTime,
244             IOobject::MUST_READ_IF_MODIFIED,
245             IOobject::NO_WRITE
246         )
247     );
249     Info<< "read surfMesh:\n  " << smesh.objectPath() << endl;
252     // Simply copy for now, but really should have a separate write method
254     MeshedSurface<face> surf(smesh);
256     if (args.optionFound("clean"))
257     {
258         surf.cleanup(true);
259     }
261     scalar scaleIn = 0;
262     if (args.optionReadIfPresent("scaleIn", scaleIn) && scaleIn > 0)
263     {
264         Info<< " -scaleIn " << scaleIn << endl;
265         surf.scalePoints(scaleIn);
266     }
268     if (fromCsys.valid())
269     {
270         Info<< " -from " << fromCsys().name() << endl;
271         tmp<pointField> tpf = fromCsys().localPosition(surf.points());
272         surf.movePoints(tpf());
273     }
275     if (toCsys.valid())
276     {
277         Info<< " -to " << toCsys().name() << endl;
278         tmp<pointField> tpf = toCsys().globalPosition(surf.points());
279         surf.movePoints(tpf());
280     }
282     scalar scaleOut = 0;
283     if (args.optionReadIfPresent("scaleOut", scaleOut) && scaleOut > 0)
284     {
285         Info<< " -scaleOut " << scaleOut << endl;
286         surf.scalePoints(scaleOut);
287     }
290     surf.writeStats(Info);
291     Info<< endl;
293     Info<< "writing " << exportName << endl;
294     surf.write(exportName);
296     Info<< "\nEnd\n" << endl;
298     return 0;
301 // ************************************************************************* //