BUGFIX: Illegal use of uninitialised value (backport)
[foam-extend-3.2.git] / applications / utilities / surface / surfaceTransformPoints / surfaceTransformPoints.C
blobce3242b016e425e5e7455a0856497ed808ec27e5
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright held by original author
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 the
13     Free Software Foundation; either version 2 of the License, or (at your
14     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, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 Description
26     Transform (scale/rotate) a surface. Like transformPoints but then for
27     surfaces.
29     The rollPitchYaw option takes three angles (degrees):
30     - roll (rotation about x) followed by
31     - pitch (rotation about y) followed by
32     - yaw (rotation about z)
34     The yawPitchRoll does yaw followed by pitch followed by roll.
36 \*---------------------------------------------------------------------------*/
38 #include "triSurface.H"
39 #include "argList.H"
40 #include "OFstream.H"
41 #include "IFstream.H"
42 #include "boundBox.H"
43 #include "transformField.H"
44 #include "Pair.H"
45 #include "quaternion.H"
47 using namespace Foam;
48 using namespace Foam::mathematicalConstant;
51 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
52 // Main program:
54 int main(int argc, char *argv[])
56     argList::noParallel();
57     argList::validArgs.clear();
59     argList::validArgs.append("surface file");
60     argList::validArgs.append("output surface file");
61     argList::validOptions.insert("translate", "vector");
62     argList::validOptions.insert("rotate", "(vector vector)");
63     argList::validOptions.insert("scale", "vector");
64     argList::validOptions.insert("rollPitchYaw", "(roll pitch yaw)");
65     argList::validOptions.insert("yawPitchRoll", "(yaw pitch roll)");
66     argList args(argc, argv);
68     fileName surfFileName(args.additionalArgs()[0]);
70     Info<< "Reading surf from " << surfFileName << " ..." << endl;
72     fileName outFileName(args.additionalArgs()[1]);
74     Info<< "Writing surf to " << outFileName << " ..." << endl;
77     if (args.options().empty())
78     {
79         FatalErrorIn(args.executable())
80             << "No options supplied, please use one or more of "
81                "-translate, -rotate or -scale options."
82             << exit(FatalError);
83     }
85     triSurface surf1(surfFileName);
87     pointField points(surf1.points());
89     if (args.optionFound("translate"))
90     {
91         vector transVector(args.optionLookup("translate")());
93         Info<< "Translating points by " << transVector << endl;
95         points += transVector;
96     }
98     if (args.optionFound("rotate"))
99     {
100         Pair<vector> n1n2(args.optionLookup("rotate")());
101         n1n2[0] /= mag(n1n2[0]);
102         n1n2[1] /= mag(n1n2[1]);
104         tensor T = rotationTensor(n1n2[0], n1n2[1]);
106         Info<< "Rotating points by " << T << endl;
108         points = transform(T, points);
109     }
110     else if (args.optionFound("rollPitchYaw"))
111     {
112         vector v(args.optionLookup("rollPitchYaw")());
114         Info<< "Rotating points by" << nl
115             << "    roll  " << v.x() << nl
116             << "    pitch " << v.y() << nl
117             << "    yaw   " << v.z() << endl;
120         // Convert to radians
121         v *= pi/180.0;
123         quaternion R(v.x(), v.y(), v.z());
125         Info<< "Rotating points by quaternion " << R << endl;
126         points = transform(R, points);
127     }
128     else if (args.optionFound("yawPitchRoll"))
129     {
130         vector v(args.optionLookup("yawPitchRoll")());
132         Info<< "Rotating points by" << nl
133             << "    yaw   " << v.x() << nl
134             << "    pitch " << v.y() << nl
135             << "    roll  " << v.z() << endl;
138         // Convert to radians
139         v *= pi/180.0;
141         scalar yaw = v.x();
142         scalar pitch = v.y();
143         scalar roll = v.z();
145         quaternion R = quaternion(vector(0, 0, 1), yaw);
146         R *= quaternion(vector(0, 1, 0), pitch);
147         R *= quaternion(vector(1, 0, 0), roll);
149         Info<< "Rotating points by quaternion " << R << endl;
150         points = transform(R, points);
151     }
153     if (args.optionFound("scale"))
154     {
155         vector scaleVector(args.optionLookup("scale")());
157         Info<< "Scaling points by " << scaleVector << endl;
159         points.replace(vector::X, scaleVector.x()*points.component(vector::X));
160         points.replace(vector::Y, scaleVector.y()*points.component(vector::Y));
161         points.replace(vector::Z, scaleVector.z()*points.component(vector::Z));
162     }
164     triSurface surf2(surf1, surf1.patches(), points);
166     surf2.write(outFileName);
168     Info << "End\n" << endl;
170     return 0;
174 // ************************************************************************* //