surfaceMeshImport.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2011-2016 OpenFOAM Foundation
9 Copyright (C) 2018-2021 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
12 This file is part of OpenFOAM.
13
14 OpenFOAM is free software: you can redistribute it and/or modify it
15 under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
18
19 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26
27Application
28 surfaceMeshImport
29
30Group
31 grpSurfaceUtilities
32
33Description
34 Import from various third-party surface formats into surfMesh
35 with optional scaling or transformations (rotate/translate)
36 on a coordinateSystem.
37
38Usage
39 \b surfaceMeshImport inputFile [OPTION]
40
41 Options:
42 - \par -clean
43 Perform some surface checking/cleanup on the input surface.
44
45 - \par -name <name>
46 Specify an alternative surface name when writing.
47
48 - \par -read-format <type>
49 Specify input file format
50
51 - \par -read-scale <scale>
52 Scale factor when reading files.
53
54 - \par -write-scale <scale>
55 Scale factor when writing files.
56
57 - \par -dict <dictionary>
58 Alternative dictionary for constant/coordinateSystems.
59
60 - \par -from <coordinateSystem>
61 Specify a coordinate system when reading files.
62
63 - \par -to <coordinateSystem>
64 Specify a coordinate system when writing files.
65
66Note
67 The filename extensions are used to determine the file format type.
68
69\*---------------------------------------------------------------------------*/
70
71#include "argList.H"
72#include "Time.H"
73
74#include "MeshedSurfaces.H"
75#include "coordinateSystems.H"
76#include "cartesianCS.H"
77
78using namespace Foam;
79
80static word getExtension(const fileName& name)
81{
82 word ext(name.ext());
83 if (ext == "gz")
84 {
85 ext = name.lessExt().ext();
86 }
87
88 return ext;
89}
90
91
92// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
93
94int main(int argc, char *argv[])
95{
96 argList::addNote
97 (
98 "Import from various third-party surface formats into surfMesh"
99 );
100
101 argList::noParallel();
102 argList::addArgument("surface", "The input surface file");
103
104 argList::addBoolOption
105 (
106 "clean",
107 "Perform some surface checking/cleanup on the input surface"
108 );
109 argList::addOption
110 (
111 "name",
112 "name",
113 "The surface name when writing (default is 'default')"
114 );
115 argList::addOption
116 (
117 "read-format",
118 "type",
119 "Input format (default: use file extension)"
120 );
121 argList::addOption
122 (
123 "read-scale",
124 "factor",
125 "Input geometry scaling factor"
126 );
127 argList::addOption
128 (
129 "write-scale",
130 "factor",
131 "Output geometry scaling factor"
132 );
133
134 argList::addOptionCompat("read-scale", {"scaleIn", 1912});
135 argList::addOptionCompat("write-scale", {"scaleOut", 1912});
136
137 argList::addOption("dict", "file", "Alternative coordinateSystems");
138
139 argList::addOption
140 (
141 "from",
142 "system",
143 "The source coordinate system, applied after '-read-scale'",
144 true // advanced
145 );
146 argList::addOption
147 (
148 "to",
149 "system",
150 "The target coordinate system, applied before '-write-scale'",
151 true // advanced
152 );
153
154 #include "setRootCase.H"
155 #include "createTime.H"
156
157 // try for the latestTime, but create "constant" as needed
158 instantList Times = runTime.times();
159 if (Times.size())
160 {
161 label startTime = Times.size()-1;
162 runTime.setTime(Times[startTime], startTime);
163 }
164 else
165 {
166 runTime.setTime(instant(0, runTime.constant()), 0);
167 }
168
169
170 const auto importName = args.get<fileName>(1);
171 const auto exportName = args.getOrDefault<word>("name", "default");
172
173 const word readFileType
174 (
175 args.getOrDefault<word>("read-format", getExtension(importName))
176 );
177
178 // Check that reading is supported
179 if (!meshedSurface::canRead(readFileType, true))
180 {
182 << "Unsupported file format(s)" << nl
183 << exit(FatalError);
184 }
185
186
187 scalar scaleFactor(0);
188
189 // The coordinate transformations (must be cartesian)
192
193 if (args.found("from") || args.found("to"))
194 {
195 IOobject ioCsys = IOobject::selectIO
196 (
198 (
199 coordinateSystems::typeName,
200 runTime.constant(),
201 runTime,
202 IOobject::MUST_READ,
203 IOobject::NO_WRITE,
204 false
205 ),
206 args.getOrDefault<fileName>("dict", "")
207 );
208
209 if (!ioCsys.typeHeaderOk<coordinateSystems>(false))
210 {
212 << ioCsys.objectPath() << nl
213 << exit(FatalError);
214 }
215
216 coordinateSystems globalCoords(ioCsys);
217
218 if (args.found("from"))
219 {
220 const word csName(args["from"]);
221 const auto* csPtr = globalCoords.cfind(csName);
222
223 if (!csPtr)
224 {
226 << "Cannot find -from " << csName << nl
227 << "available coordinateSystems: "
228 << flatOutput(globalCoords.names()) << nl
229 << exit(FatalError);
230 }
231
232 fromCsys = autoPtr<coordSystem::cartesian>::New(*csPtr);
233 }
234
235 if (args.found("to"))
236 {
237 const word csName(args["to"]);
238 const auto* csPtr = globalCoords.cfind(csName);
239
240 if (!csPtr)
241 {
243 << "Cannot find -to " << csName << nl
244 << "available coordinateSystems: "
245 << flatOutput(globalCoords.names()) << nl
246 << exit(FatalError);
247 }
248
250 }
251
252 // Maybe fix this later
253 if (fromCsys && toCsys)
254 {
256 << "Only allowed '-from' or '-to' option at the moment."
257 << exit(FatalError);
258 }
259 }
260
261
262 meshedSurface surf(importName, readFileType);
263
264 if (args.readIfPresent("read-scale", scaleFactor) && scaleFactor > 0)
265 {
266 Info<< "scale input " << scaleFactor << nl;
267 surf.scalePoints(scaleFactor);
268 }
269
270 if (args.found("clean"))
271 {
272 surf.cleanup(true);
273 }
274
275 if (fromCsys)
276 {
277 Info<< "move points from coordinate system: "
278 << fromCsys->name() << endl;
279 tmp<pointField> tpf = fromCsys->localPosition(surf.points());
280 surf.movePoints(tpf());
281 }
282
283 if (toCsys)
284 {
285 Info<< "move points to coordinate system: "
286 << toCsys->name() << endl;
287 tmp<pointField> tpf = toCsys->globalPosition(surf.points());
288 surf.movePoints(tpf());
289 }
290
291 if (args.readIfPresent("write-scale", scaleFactor) && scaleFactor > 0)
292 {
293 Info<< "scale output " << scaleFactor << nl;
294 surf.scalePoints(scaleFactor);
295 }
296
297 surfMesh smesh
298 (
300 (
301 exportName,
302 runTime.constant(),
303 runTime
304 ),
305 std::move(surf)
306 );
307
308
309 Info<< "writing surfMesh:\n " << smesh.objectPath() << endl;
310 smesh.write();
311
312 Info<< "\nEnd\n" << endl;
313
314 return 0;
315}
316
317// ************************************************************************* //
Foam::label startTime
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Definition: IOobject.H:170
bool typeHeaderOk(const bool checkType=true, const bool search=true, const bool verbose=true)
Read header (uses typeFilePath to find file) and check its info.
fileName objectPath() const
The complete path + object name.
Definition: IOobjectI.H:214
virtual bool write(const token &tok)=0
Write token to stream or otherwise handle it.
void size(const label n)
Older name for setAddressableSize.
Definition: UList.H:114
T get(const label index) const
Get a value from the argument at index.
Definition: argListI.H:278
bool found(const word &optName) const
Return true if the named option is found.
Definition: argListI.H:178
bool readIfPresent(const word &optName, T &val) const
Read a value from the named option if present.
Definition: argListI.H:323
T getOrDefault(const word &optName, const T &deflt) const
Get a value from the named option if present, or return default.
Definition: argListI.H:307
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
Definition: autoPtr.H:66
A centralized collection of named coordinate systems.
A class for handling file names.
Definition: fileName.H:76
An instant of time. Contains the time value and name. Uses Foam::Time when formatting the name.
Definition: instant.H:56
A surface mesh consisting of general polygon faces that has IO capabilities and a registry for storin...
Definition: surfMesh.H:68
A class for managing temporary objects.
Definition: tmp.H:65
A class for handling words, derived from Foam::string.
Definition: word.H:68
word ext() const
Return file name extension (part after last .)
Definition: word.C:126
word lessExt() const
Return word without extension (part before last .)
Definition: word.C:113
engineTime & runTime
Namespace for OpenFOAM.
messageStream Info
Information stream (stdout output on master, null elsewhere)
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:372
FlatOutput::OutputAdaptor< Container, Delimiters > flatOutput(const Container &obj, Delimiters delim)
Global flatOutput() function with specified output delimiters.
Definition: FlatOutput.H:215
error FatalError
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
Definition: exprTraits.C:59
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:130
constexpr char nl
The newline '\n' character (0x0a)
Definition: Ostream.H:53
Foam::argList args(argc, argv)