surfaceMeshExport.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 | Copyright (C) 2011-2016 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
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.
15 
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.
20 
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/>.
23 
24 Application
25  surfaceMeshExport
26 
27 Description
28  Export from surfMesh to various third-party surface formats with
29  optional scaling or transformations (rotate/translate) on a
30  coordinateSystem.
31 
32 Usage
33  \b surfaceMeshExport outputFile [OPTION]
34 
35  Options:
36  - \par -clean
37  Perform some surface checking/cleanup on the input surface.
38 
39  - \par -name <name>
40  Specify an alternative surface name when writing.
41 
42  - \par -scaleIn <scale>
43  Specify a scaling factor when reading files.
44 
45  - \par -scaleOut <scale>
46  Specify a scaling factor when writing files.
47 
48  - \par -dict <dictionary>
49  Specify an alternative dictionary for constant/coordinateSystems.
50 
51  - \par -from <coordinateSystem>
52  Specify a coordinate system when reading files.
53 
54  - \par -to <coordinateSystem>
55  Specify a coordinate system when writing files.
56 
57 Note
58  The filename extensions are used to determine the file format type.
59 
60 \*---------------------------------------------------------------------------*/
61 
62 #include "argList.H"
63 #include "Time.H"
64 
65 #include "MeshedSurfaces.H"
66 #include "coordinateSystems.H"
67 
68 using namespace Foam;
69 
70 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
71 
72 int main(int argc, char *argv[])
73 {
75  (
76  "export from surfMesh to various third-party surface formats"
77  );
78 
80  argList::validArgs.append("outputFile");
81 
83  (
84  "clean",
85  "perform some surface checking/cleanup on the input surface"
86  );
88  (
89  "name",
90  "name",
91  "specify an alternative surface name when reading - "
92  "default is 'default'"
93  );
95  (
96  "scaleIn",
97  "factor",
98  "geometry scaling factor on input - default is 1"
99  );
101  (
102  "scaleOut",
103  "factor",
104  "geometry scaling factor on output - default is 1"
105  );
106  #include "addDictOption.H"
108  (
109  "from",
110  "coordinateSystem",
111  "specify the source coordinate system, applied after '-scaleIn'"
112  );
114  (
115  "to",
116  "coordinateSystem",
117  "specify the target coordinate system, applied before '-scaleOut'"
118  );
119 
120  argList args(argc, argv);
121  Time runTime(args.rootPath(), args.caseName());
122 
123  const fileName exportName = args[1];
124  const word importName = args.optionLookupOrDefault<word>("name", "default");
125 
126  // check that writing is supported
127  if (!MeshedSurface<face>::canWriteType(exportName.ext(), true))
128  {
129  return 1;
130  }
131 
132 
133  // get the coordinate transformations
134  autoPtr<coordinateSystem> fromCsys;
136 
137  if (args.optionFound("from") || args.optionFound("to"))
138  {
139  autoPtr<IOobject> ioPtr;
140 
141  if (args.optionFound("dict"))
142  {
143  const fileName dictPath = args["dict"];
144 
145  ioPtr.set
146  (
147  new IOobject
148  (
149  (
150  isDir(dictPath)
151  ? dictPath/coordinateSystems::typeName
152  : dictPath
153  ),
154  runTime,
157  false
158  )
159  );
160  }
161  else
162  {
163  ioPtr.set
164  (
165  new IOobject
166  (
167  coordinateSystems::typeName,
168  runTime.constant(),
169  runTime,
172  false
173  )
174  );
175  }
176 
177 
178  if (!ioPtr->headerOk())
179  {
181  << ioPtr->objectPath() << nl
182  << exit(FatalError);
183  }
184 
185  coordinateSystems csLst(ioPtr());
186 
187  if (args.optionFound("from"))
188  {
189  const word csName = args["from"];
190 
191  const label csIndex = csLst.findIndex(csName);
192  if (csIndex < 0)
193  {
195  << "Cannot find -from " << csName << nl
196  << "available coordinateSystems: " << csLst.toc() << nl
197  << exit(FatalError);
198  }
199 
200  fromCsys.reset(new coordinateSystem(csLst[csIndex]));
201  }
202 
203  if (args.optionFound("to"))
204  {
205  const word csName = args["to"];
206 
207  const label csIndex = csLst.findIndex(csName);
208  if (csIndex < 0)
209  {
211  << "Cannot find -to " << csName << nl
212  << "available coordinateSystems: " << csLst.toc() << nl
213  << exit(FatalError);
214  }
215 
216  toCsys.reset(new coordinateSystem(csLst[csIndex]));
217  }
218 
219 
220  // maybe fix this later
221  if (fromCsys.valid() && toCsys.valid())
222  {
224  << exit(FatalError);
225  }
226  }
227 
228 
229  surfMesh smesh
230  (
231  IOobject
232  (
233  importName,
234  runTime.constant(),
235  runTime,
238  )
239  );
240 
241  Info<< "read surfMesh:\n " << smesh.objectPath() << endl;
242 
243 
244  // Simply copy for now, but really should have a separate write method
245 
246  MeshedSurface<face> surf(smesh);
247 
248  if (args.optionFound("clean"))
249  {
250  surf.cleanup(true);
251  }
252 
253  scalar scaleIn = 0;
254  if (args.optionReadIfPresent("scaleIn", scaleIn) && scaleIn > 0)
255  {
256  Info<< " -scaleIn " << scaleIn << endl;
257  surf.scalePoints(scaleIn);
258  }
259 
260  if (fromCsys.valid())
261  {
262  Info<< " -from " << fromCsys().name() << endl;
263  tmp<pointField> tpf = fromCsys().localPosition(surf.points());
264  surf.movePoints(tpf());
265  }
266 
267  if (toCsys.valid())
268  {
269  Info<< " -to " << toCsys().name() << endl;
270  tmp<pointField> tpf = toCsys().globalPosition(surf.points());
271  surf.movePoints(tpf());
272  }
273 
274  scalar scaleOut = 0;
275  if (args.optionReadIfPresent("scaleOut", scaleOut) && scaleOut > 0)
276  {
277  Info<< " -scaleOut " << scaleOut << endl;
278  surf.scalePoints(scaleOut);
279  }
280 
281 
282  surf.writeStats(Info);
283  Info<< endl;
284 
285  Info<< "writing " << exportName << endl;
286  surf.write(exportName);
287 
288  Info<< "\nEnd\n" << endl;
289 
290  return 0;
291 }
292 
293 // ************************************************************************* //
Base class for other coordinate system specifications.
fileName objectPath() const
Return complete path + object name.
Definition: IOobject.H:363
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:59
A class for handling file names.
Definition: fileName.H:69
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:124
error FatalError
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:319
A surface geometry mesh with zone information, not to be confused with the similarly named surfaceMes...
Definition: MeshedSurface.H:72
Provides a centralized coordinateSystem collection.
bool optionReadIfPresent(const word &opt, T &) const
Read a value from the named option if present.
Definition: argListI.H:198
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:253
static void noParallel()
Remove the parallel options.
Definition: argList.C:146
static SLList< string > validArgs
A list of valid (mandatory) arguments.
Definition: argList.H:154
bool isDir(const fileName &)
Does the name exist as a DIRECTORY in the file system?
Definition: POSIX.C:486
const fileName & rootPath() const
Return root path.
Definition: argListI.H:36
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
Definition: Time.H:68
T optionLookupOrDefault(const word &opt, const T &deflt) const
Read a value from the named option if present.
Definition: argListI.H:237
const fileName & caseName() const
Return case name (parallel run) or global case (serial run)
Definition: argListI.H:42
void reset(T *=0)
If object pointer already set, delete object and set to given.
Definition: autoPtrI.H:114
bool optionFound(const word &opt) const
Return true if the named option is found.
Definition: argListI.H:108
A class for handling words, derived from string.
Definition: word.H:59
Extract command arguments and options from the supplied argc and argv parameters. ...
Definition: argList.H:102
static void addOption(const word &opt, const string &param="", const string &usage="")
Add to an option to validOptions with usage information.
Definition: argList.C:93
bool valid() const
Return true if the autoPtr valid (ie, the pointer is set).
Definition: autoPtrI.H:83
A surface mesh consisting of general polygon faces.
Definition: surfMesh.H:55
static const char nl
Definition: Ostream.H:262
void set(T *)
Set pointer to that given.
Definition: autoPtrI.H:99
messageStream Info
bool headerOk()
Read and check header info.
Definition: IOobject.C:400
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
Definition: PtrList.H:53
virtual Ostream & write(const token &)=0
Write next token to stream.
static void addBoolOption(const word &opt, const string &usage="")
Add to a bool option to validOptions with usage information.
Definition: argList.C:83
static void addNote(const string &)
Add extra notes for the usage information.
Definition: argList.C:124
A class for managing temporary objects.
Definition: PtrList.H:54
Foam::argList args(argc, argv)
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
Definition: IOobject.H:91
Namespace for OpenFOAM.