diff --git a/applications/test/surfaceIntersection/Test-surfaceIntersection.C b/applications/test/surfaceIntersection/Test-surfaceIntersection.C index ddf122f60a90b4adcc896811b1db39fbe79a8d40..b841663790085f90e3192cafdea260e6a4907b99 100644 --- a/applications/test/surfaceIntersection/Test-surfaceIntersection.C +++ b/applications/test/surfaceIntersection/Test-surfaceIntersection.C @@ -41,10 +41,15 @@ using namespace Foam; autoPtr<triSurface> loadSurface ( const Foam::Time& runTime, - const fileName& surfName + const fileName& surfName, + const scalar scaleFactor ) { - Info<< "Reading surface " << surfName << endl; + Info<< "Reading surface " << surfName << nl; + if (scaleFactor > 0) + { + Info<<"Scaling : " << scaleFactor << nl; + } const fileName fallback = runTime.constantPath()/triSurfaceMesh::meshSubDir/surfName; @@ -52,11 +57,11 @@ autoPtr<triSurface> loadSurface autoPtr<triSurface> surfPtr; if (isFile(surfName)) { - surfPtr.set(new triSurface(surfName)); + surfPtr.set(new triSurface(surfName, scaleFactor)); } else if (isFile(fallback)) { - surfPtr.set(new triSurface(fallback)); + surfPtr.set(new triSurface(fallback, scaleFactor)); } else { @@ -102,6 +107,12 @@ int main(int argc, char *argv[]) "mergeTol", "merge points (and edges) using the specified tolerance" ); + argList::addOption + ( + "scale", + "factor", + "geometry scaling factor" + ); #include "addDictOption.H" @@ -117,16 +128,18 @@ int main(int argc, char *argv[]) #include "setRootCase.H" #include "createTime.H" + const scalar scaleFactor = args.optionLookupOrDefault<scalar>("scale", -1); + const word outputFile(args.executable() + ".obj"); const fileName surf1Name(args[1]); - triSurface surf1 = loadSurface(runTime, surf1Name)(); + triSurface surf1 = loadSurface(runTime, surf1Name, scaleFactor)(); Info<< surf1Name << " statistics:" << endl; surf1.writeStats(Info); Info<< endl; const fileName surf2Name(args[2]); - triSurface surf2 = loadSurface(runTime, surf2Name)(); + triSurface surf2 = loadSurface(runTime, surf2Name, scaleFactor)(); Info<< surf2Name << " statistics:" << endl; surf2.writeStats(Info); Info<< endl; diff --git a/applications/utilities/mesh/conversion/foamToFireMesh/foamToFireMesh.C b/applications/utilities/mesh/conversion/foamToFireMesh/foamToFireMesh.C index 87ddd4dff938fdef1f9d626dbd180d92978db89d..216f253d5f2f6791ad482b1a05997a6552e7e5f7 100644 --- a/applications/utilities/mesh/conversion/foamToFireMesh/foamToFireMesh.C +++ b/applications/utilities/mesh/conversion/foamToFireMesh/foamToFireMesh.C @@ -91,7 +91,7 @@ int main(int argc, char *argv[]) // ~~~~~~~~~~~~~~~~~~~~~ fileFormats::FIREMeshWriter::binary = !args.optionFound("ascii"); - // default: rescale from [m] to [mm] + // Default: no rescaling scalar scaleFactor = 1; if (args.optionReadIfPresent("scale", scaleFactor)) { diff --git a/applications/utilities/mesh/manipulation/transformPoints/transformPoints.C b/applications/utilities/mesh/manipulation/transformPoints/transformPoints.C index db2f571043f341e16f44c8b2bfb2e7a81153faac..b082bf39c2bd9d826b0e53b1c29cbbc64843966f 100644 --- a/applications/utilities/mesh/manipulation/transformPoints/transformPoints.C +++ b/applications/utilities/mesh/manipulation/transformPoints/transformPoints.C @@ -43,8 +43,8 @@ Usage or -yawPitchRoll (yawdegrees pitchdegrees rolldegrees) or -rollPitchYaw (rolldegrees pitchdegrees yawdegrees) - -scale vector - Scales the points by the given vector. + -scale scalar|vector + Scales the points by the given scalar or vector. The any or all of the three options may be specified and are processed in the above order. @@ -182,9 +182,9 @@ int main(int argc, char *argv[]) argList::addOption ( "scale", - "vector", - "scale by the specified amount - eg, '(0.001 0.001 0.001)' for a " - "uniform [mm] to [m] scaling" + "scalar | vector", + "scale by the specified amount - eg, for a uniform [mm] to [m] scaling " + "use either (0.001 0.001 0.001)' or simply '0.001'" ); #include "addRegionOption.H" @@ -262,10 +262,10 @@ int main(int argc, char *argv[]) << " pitch " << v.y() << nl << " yaw " << v.z() << nl; - // Convert to radians + // degToRad v *= pi/180.0; - quaternion R(quaternion::rotationSequence::XYZ, v); + const quaternion R(quaternion::rotationSequence::XYZ, v); Info<< "Rotating points by quaternion " << R << endl; points = transform(R, points); @@ -282,16 +282,10 @@ int main(int argc, char *argv[]) << " pitch " << v.y() << nl << " roll " << v.z() << nl; - // Convert to radians + // degToRad v *= pi/180.0; - scalar yaw = v.x(); - scalar pitch = v.y(); - scalar roll = v.z(); - - quaternion R = quaternion(vector(0, 0, 1), yaw); - R *= quaternion(vector(0, 1, 0), pitch); - R *= quaternion(vector(1, 0, 0), roll); + const quaternion R(quaternion::rotationSequence::ZYX, v); Info<< "Rotating points by quaternion " << R << endl; points = transform(R, points); @@ -302,13 +296,34 @@ int main(int argc, char *argv[]) } } - if (args.optionReadIfPresent("scale", v)) + if (args.optionFound("scale")) { - Info<< "Scaling points by " << v << endl; + // Use readList to handle single or multiple values + const List<scalar> scaling = args.optionReadList<scalar>("scale"); - points.replace(vector::X, v.x()*points.component(vector::X)); - points.replace(vector::Y, v.y()*points.component(vector::Y)); - points.replace(vector::Z, v.z()*points.component(vector::Z)); + if (scaling.size() == 1) + { + Info<< "Scaling points uniformly by " << scaling[0] << nl; + points *= scaling[0]; + } + else if (scaling.size() == 3) + { + Info<< "Scaling points by (" + << scaling[0] << " " + << scaling[1] << " " + << scaling[2] << ")" << nl; + + points.replace(vector::X, scaling[0]*points.component(vector::X)); + points.replace(vector::Y, scaling[1]*points.component(vector::Y)); + points.replace(vector::Z, scaling[2]*points.component(vector::Z)); + } + else + { + FatalError + << "-scale with 1 or 3 components only" << nl + << "given: " << args["scale"] << endl + << exit(FatalError); + } } // Set the precision of the points data to 10 diff --git a/applications/utilities/surface/surfaceAdd/surfaceAdd.C b/applications/utilities/surface/surfaceAdd/surfaceAdd.C index 5caa3e070316edabcc7f8747fe1277673d9a7ea0..0be9024ebd9e636e79621d960c5d5d79a076d1d0 100644 --- a/applications/utilities/surface/surfaceAdd/surfaceAdd.C +++ b/applications/utilities/surface/surfaceAdd/surfaceAdd.C @@ -71,6 +71,12 @@ int main(int argc, char *argv[]) "mergeRegions", "combine regions from both surfaces" ); + argList::addOption + ( + "scale", + "factor", + "geometry scaling factor on input surfaces" + ); argList args(argc, argv); @@ -81,6 +87,8 @@ int main(int argc, char *argv[]) const bool addPoint = args.optionFound("points"); const bool mergeRegions = args.optionFound("mergeRegions"); + const scalar scaleFactor = args.optionLookupOrDefault<scalar>("scale", -1); + if (addPoint) { Info<< "Reading a surface and adding points from a file" @@ -117,8 +125,12 @@ int main(int argc, char *argv[]) << "Writing : " << outFileName << nl << endl; } - const triSurface surface1(inFileName1); + if (scaleFactor > 0) + { + Info<< "Scaling : " << scaleFactor << nl; + } + const triSurface surface1(inFileName1, scaleFactor); Info<< "Surface1:" << endl; surface1.writeStats(Info); Info<< endl; @@ -131,7 +143,7 @@ int main(int argc, char *argv[]) if (addPoint) { IFstream pointsFile(args["points"]); - pointField extraPoints(pointsFile); + const pointField extraPoints(pointsFile); Info<< "Additional Points:" << extraPoints.size() << endl; @@ -139,17 +151,16 @@ int main(int argc, char *argv[]) label pointi = pointsAll.size(); pointsAll.setSize(pointsAll.size() + extraPoints.size()); - forAll(extraPoints, i) + for (const auto& pt : extraPoints) { - pointsAll[pointi++] = extraPoints[i]; + pointsAll[pointi++] = pt; } combinedSurf = triSurface(surface1, surface1.patches(), pointsAll); } else { - const triSurface surface2(inFileName2); - + const triSurface surface2(inFileName2, scaleFactor); Info<< "Surface2:" << endl; surface2.writeStats(Info); Info<< endl; @@ -165,21 +176,19 @@ int main(int argc, char *argv[]) label pointi = 0; // Copy points1 into pointsAll - forAll(points1, point1i) + for (const auto& pt : points1) { - pointsAll[pointi++] = points1[point1i]; + pointsAll[pointi++] = pt; } // Add surface2 points - forAll(points2, point2i) + for (const auto& pt : points2) { - pointsAll[pointi++] = points2[point2i]; + pointsAll[pointi++] = pt; } label trianglei = 0; - - // Determine map for both regions label nNewPatches = 0; labelList patch1Map(surface1.patches().size()); @@ -192,17 +201,17 @@ int main(int argc, char *argv[]) forAll(surface1.patches(), i) { const word& name = surface1.patches()[i].name(); - HashTable<label>::iterator iter = nameToPatch.find(name); + auto iter = nameToPatch.find(name); label combinedi; - if (iter == nameToPatch.end()) + if (iter.found()) { - combinedi = nameToPatch.size(); - nameToPatch.insert(name, combinedi); + combinedi = iter.object(); } else { - combinedi = iter(); + combinedi = nameToPatch.size(); + nameToPatch.insert(name, combinedi); } patch1Map[i] = combinedi; } @@ -212,17 +221,17 @@ int main(int argc, char *argv[]) forAll(surface2.patches(), i) { const word& name = surface2.patches()[i].name(); - HashTable<label>::iterator iter = nameToPatch.find(name); + auto iter = nameToPatch.find(name); label combinedi; - if (iter == nameToPatch.end()) + if (iter.found()) { - combinedi = nameToPatch.size(); - nameToPatch.insert(name, combinedi); + combinedi = iter.object(); } else { - combinedi = iter(); + combinedi = nameToPatch.size(); + nameToPatch.insert(name, combinedi); } patch2Map[i] = combinedi; } @@ -245,11 +254,9 @@ int main(int argc, char *argv[]) } - // Copy triangles1 into trianglesAll - forAll(surface1, facei) + for (const labelledTri& tri : surface1) { - const labelledTri& tri = surface1[facei]; labelledTri& destTri = facesAll[trianglei++]; destTri.triFace::operator=(tri); @@ -257,10 +264,8 @@ int main(int argc, char *argv[]) } // Add (renumbered) surface2 triangles - forAll(surface2, facei) + for (const labelledTri& tri : surface2) { - const labelledTri& tri = surface2[facei]; - labelledTri& destTri = facesAll[trianglei++]; destTri[0] = tri[0] + points1.size(); destTri[1] = tri[1] + points1.size(); diff --git a/applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C b/applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C index 52c5d9c08952acd1ae4079888483aa38d78d10d7..6dca6415bff19bd16b63ef731c50b24d76bb17d9 100644 --- a/applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C +++ b/applications/utilities/surface/surfaceBooleanFeatures/surfaceBooleanFeatures.C @@ -1517,6 +1517,12 @@ int main(int argc, char *argv[]) argList::validArgs.append("surfaceFile1"); argList::validArgs.append("surfaceFile2"); + argList::addOption + ( + "scale", + "factor", + "Geometry scaling factor (both surfaces)" + ); argList::addBoolOption ( "surf1Baffle", @@ -1587,6 +1593,10 @@ int main(int argc, char *argv[]) } + // Scale factor for both surfaces: + const scalar scaleFactor + = args.optionLookupOrDefault<scalar>("scale", -1); + const word surf1Name(args[2]); Info<< "Reading surface " << surf1Name << endl; triSurfaceMesh surf1 @@ -1599,6 +1609,11 @@ int main(int argc, char *argv[]) runTime ) ); + if (scaleFactor > 0) + { + Info<< "Scaling : " << scaleFactor << nl; + surf1.scalePoints(scaleFactor); + } Info<< surf1Name << " statistics:" << endl; surf1.writeStats(Info); @@ -1616,6 +1631,11 @@ int main(int argc, char *argv[]) runTime ) ); + if (scaleFactor > 0) + { + Info<< "Scaling : " << scaleFactor << nl; + surf2.scalePoints(scaleFactor); + } Info<< surf2Name << " statistics:" << endl; surf2.writeStats(Info); @@ -1627,7 +1647,7 @@ int main(int argc, char *argv[]) edgeIntersections edgeCuts1; edgeIntersections edgeCuts2; - bool invertedSpace = args.optionFound("invertedSpace"); + const bool invertedSpace = args.optionFound("invertedSpace"); if (invertedSpace && validActions[action] == booleanSurface::DIFFERENCE) { @@ -1736,9 +1756,7 @@ int main(int argc, char *argv[]) const extendedFeatureEdgeMesh& feMesh = feMeshPtr(); feMesh.writeStats(Info); - feMesh.write(); - feMesh.writeObj(feMesh.path()/sFeatFileName); { diff --git a/applications/utilities/surface/surfaceClean/surfaceClean.C b/applications/utilities/surface/surfaceClean/surfaceClean.C index b11845df044e15bdb36cf99e3db4138245a0ee98..ca806edf354fc50a9276d6b3e6b5bd8bfb4bc531 100644 --- a/applications/utilities/surface/surfaceClean/surfaceClean.C +++ b/applications/utilities/surface/surfaceClean/surfaceClean.C @@ -60,7 +60,13 @@ int main(int argc, char *argv[]) argList::addBoolOption ( "noClean", - "suppress surface checking/cleanup on the input surface" + "Suppress surface checking/cleanup on the input surface" + ); + argList::addOption + ( + "scale", + "factor", + "Input geometry scaling factor" ); argList args(argc, argv); @@ -77,7 +83,12 @@ int main(int argc, char *argv[]) Info<< "Reading surface from " << inFileName << " ..." << nl << endl; - triSurface surf(inFileName); + + triSurface surf + ( + inFileName, + args.optionLookupOrDefault<scalar>("scale", -1) + ); surf.writeStats(Info); if (!args.optionFound("noClean")) @@ -90,7 +101,7 @@ int main(int argc, char *argv[]) while (true) { - label nEdgeCollapse = collapseEdge(surf, minLen); + const label nEdgeCollapse = collapseEdge(surf, minLen); if (nEdgeCollapse == 0) { @@ -99,7 +110,7 @@ int main(int argc, char *argv[]) } while (true) { - label nSplitEdge = collapseBase(surf, minLen, minQuality); + const label nSplitEdge = collapseBase(surf, minLen, minQuality); if (nSplitEdge == 0) { diff --git a/applications/utilities/surface/surfaceCoarsen/surfaceCoarsen.C b/applications/utilities/surface/surfaceCoarsen/surfaceCoarsen.C index 5be802c3f9a79b62822d07341f28aea9fb6d034b..8adaef8d9d03ca64b6d72c983df6ab16425bbae5 100644 --- a/applications/utilities/surface/surfaceCoarsen/surfaceCoarsen.C +++ b/applications/utilities/surface/surfaceCoarsen/surfaceCoarsen.C @@ -28,7 +28,7 @@ Group grpSurfaceUtilities Description - Surface coarsening using `bunnylod' + Surface coarsening using 'bunnylod' Reference: \verbatim @@ -75,6 +75,13 @@ int main(int argc, char *argv[]) argList::validArgs.append("surfaceFile"); argList::validArgs.append("reductionFactor"); argList::validArgs.append("output surfaceFile"); + argList::addOption + ( + "scale", + "factor", + "input geometry scaling factor" + ); + argList args(argc, argv); const fileName inFileName = args[1]; @@ -90,40 +97,39 @@ int main(int argc, char *argv[]) << exit(FatalError); } - Info<< "Input surface :" << inFileName << endl - << "Reduction factor:" << reduction << endl - << "Output surface :" << outFileName << endl << endl; + const scalar scaleFactor = args.optionLookupOrDefault<scalar>("scale", -1); - const triSurface surf(inFileName); + Info<< "Input surface :" << inFileName << nl + << "Scaling factor :" << scaleFactor << nl + << "Reduction factor:" << reduction << nl + << "Output surface :" << outFileName << nl + << endl; + + const triSurface surf(inFileName, scaleFactor); Info<< "Surface:" << endl; surf.writeStats(Info); Info<< endl; - - ::List< ::Vector> vert; // global list of vertices - ::List< ::tridata> tri; // global list of triangles + ::List<::Vector> vert; // global list of vertices + ::List<::tridata> tri; // global list of triangles // Convert triSurface to progmesh format. Note: can use global point // numbering since surface read in from file. const pointField& pts = surf.points(); - forAll(pts, ptI) + for (const point& pt : pts) { - const point& pt = pts[ptI]; - - vert.Add( ::Vector(pt.x(), pt.y(), pt.z())); + vert.Add(::Vector(pt.x(), pt.y(), pt.z())); } - forAll(surf, facei) + for (const labelledTri& f : surf) { - const labelledTri& f = surf[facei]; - tridata td; - td.v[0]=f[0]; - td.v[1]=f[1]; - td.v[2]=f[2]; + td.v[0] = f[0]; + td.v[1] = f[1]; + td.v[2] = f[2]; tri.Add(td); } @@ -133,20 +139,20 @@ int main(int argc, char *argv[]) ::ProgressiveMesh(vert,tri,collapse_map,permutation); // rearrange the vertex list - ::List< ::Vector> temp_list; - for (int i=0;i<vert.num;i++) + ::List<::Vector> temp_list; + for (int i=0; i<vert.num; i++) { temp_list.Add(vert[i]); } - for (int i=0;i<vert.num;i++) + for (int i=0; i<vert.num; i++) { - vert[permutation[i]]=temp_list[i]; + vert[permutation[i]] = temp_list[i]; } // update the changes in the entries in the triangle list - for (int i=0;i<tri.num;i++) + for (int i=0; i<tri.num; i++) { - for (int j=0;j<3;j++) + for (int j=0; j<3; j++) { tri[i].v[j] = permutation[tri[i].v[j]]; } diff --git a/applications/utilities/surface/surfaceConvert/surfaceConvert.C b/applications/utilities/surface/surfaceConvert/surfaceConvert.C index f19127cd5e865ace61b4eb91c575907a95a78eea..9337770fd8951db5151153bc8e3e36eecbf68d5d 100644 --- a/applications/utilities/surface/surfaceConvert/surfaceConvert.C +++ b/applications/utilities/surface/surfaceConvert/surfaceConvert.C @@ -74,24 +74,24 @@ int main(int argc, char *argv[]) argList::addBoolOption ( "clean", - "perform some surface checking/cleanup on the input surface" + "Perform some surface checking/cleanup on the input surface" ); argList::addBoolOption ( "group", - "reorder faces into groups; one per region" + "Reorder faces into groups; one per region" ); argList::addOption ( "scale", "factor", - "geometry scaling factor - default is 1" + "Input geometry scaling factor" ); argList::addOption ( "writePrecision", "label", - "write to output with the specified precision" + "Write to output with the specified precision" ); argList args(argc, argv); @@ -116,8 +116,10 @@ int main(int argc, char *argv[]) << exit(FatalError); } + const scalar scaleFactor = args.optionLookupOrDefault<scalar>("scale", -1); + Info<< "Reading : " << importName << endl; - triSurface surf(importName); + triSurface surf(importName, scaleFactor); Info<< "Read surface:" << endl; surf.writeStats(Info); @@ -144,13 +146,6 @@ int main(int argc, char *argv[]) } Info<< "writing " << exportName; - - scalar scaleFactor = 0; - if (args.optionReadIfPresent("scale", scaleFactor) && scaleFactor > 0) - { - Info<< " with scaling " << scaleFactor; - surf.scalePoints(scaleFactor); - } Info<< endl; surf.write(exportName, sortByRegion); diff --git a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C index 2810e084c0be96c18f6c55827d93c42492c0f351..ca7cba62cc624f7425d00d43a5f925221ff54cd9 100644 --- a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C +++ b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C @@ -339,8 +339,15 @@ int main(int argc, char *argv[]) << " writeObj=" << writeObj << " writeVTK=" << writeVTK << nl; + scalar scaleFactor = -1; + // Allow rescaling of the surface points (eg, mm -> m) + if (surfaceDict.readIfPresent("scale", scaleFactor) && scaleFactor > 0) + { + Info<<"Scaling : " << scaleFactor << nl; + } + // Load a single file, or load and combine multiple selected files - autoPtr<triSurface> surfPtr = loader.load(loadingOption); + autoPtr<triSurface> surfPtr = loader.load(loadingOption, scaleFactor); if (!surfPtr.valid() || surfPtr().empty()) { FatalErrorInFunction diff --git a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtractDict b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtractDict index 176a0e193842f6aba0610b97b3a4871bdf1548ae..c03e80ced6f9644b449d01beaf75af308a89eefe 100644 --- a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtractDict +++ b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtractDict @@ -50,6 +50,9 @@ outputName1 surfaces (surface1.stl surface2.nas); + // mm -> m scaling + // scale 0.001; + // Generate additional intersection features (none | self | region) intersectionMethod self; diff --git a/applications/utilities/surface/surfaceFind/surfaceFind.C b/applications/utilities/surface/surfaceFind/surfaceFind.C index 165eb976a0104c3e4285ec8788ac13dceef1c1ea..f0dd8c39a2a1068cdf8464c8ccc3ab68c0e221a7 100644 --- a/applications/utilities/surface/surfaceFind/surfaceFind.C +++ b/applications/utilities/surface/surfaceFind/surfaceFind.C @@ -123,9 +123,8 @@ int main(int argc, char *argv[]) Info<< " " << points[f[fp]] << "\n"; } - Info<< endl; - - Info<< "End\n" << endl; + Info<< nl + << "End\n" << endl; return 0; } diff --git a/applications/utilities/surface/surfaceInertia/surfaceInertia.C b/applications/utilities/surface/surfaceInertia/surfaceInertia.C index fb45390688fda6af570c84c8ccf6bfa0d0066f1d..ce53c2ae91ece0399ee2b4b38ed9285784b560df 100644 --- a/applications/utilities/surface/surfaceInertia/surfaceInertia.C +++ b/applications/utilities/surface/surfaceInertia/surfaceInertia.C @@ -90,7 +90,7 @@ int main(int argc, char *argv[]) vector refPt = Zero; bool calcAroundRefPt = args.optionReadIfPresent("referencePoint", refPt); - triSurface surf(surfFileName); + const triSurface surf(surfFileName); scalar m = 0.0; vector cM = Zero; diff --git a/applications/utilities/surface/surfaceInflate/surfaceInflate.C b/applications/utilities/surface/surfaceInflate/surfaceInflate.C index 145e2b3490d53b974773edaba9547dec762016d0..3cfdb743bed41a6eb9aa873a20ef0f2edb731f2e 100644 --- a/applications/utilities/surface/surfaceInflate/surfaceInflate.C +++ b/applications/utilities/surface/surfaceInflate/surfaceInflate.C @@ -44,7 +44,7 @@ Usage Specify a feature angle - E.g. inflate surface by 2cm with 1.5 safety factor: + E.g. inflate surface by 20mm with 1.5 safety factor: surfaceInflate DTC-scaled.obj 0.02 1.5 -featureAngle 45 -nSmooth 2 \*---------------------------------------------------------------------------*/ diff --git a/applications/utilities/surface/surfaceMeshInfo/surfaceMeshInfo.C b/applications/utilities/surface/surfaceMeshInfo/surfaceMeshInfo.C index bf965eee0db16ffa5042ca07cf1323d7a1280bb0..6f58fe5cc3e752e060e6d0e4300ab5997d059906 100644 --- a/applications/utilities/surface/surfaceMeshInfo/surfaceMeshInfo.C +++ b/applications/utilities/surface/surfaceMeshInfo/surfaceMeshInfo.C @@ -87,7 +87,7 @@ int main(int argc, char *argv[]) ( "scale", "factor", - "geometry scaling factor - default is 1" + "input geometry scaling factor" ); argList::addBoolOption ( @@ -119,10 +119,10 @@ int main(int argc, char *argv[]) // use UnsortedMeshedSurface, not MeshedSurface to maintain ordering UnsortedMeshedSurface<face> surf(importName); - scalar scaling = 0; - if (args.optionReadIfPresent("scale", scaling) && scaling > 0) + const scalar scaling = args.optionLookupOrDefault<scalar>("scale", -1); + if (scaling > 0) { - Info<< " -scale " << scaling << endl; + Info<< " -scale " << scaling << nl; surf.scalePoints(scaling); } diff --git a/applications/utilities/surface/surfaceOrient/surfaceOrient.C b/applications/utilities/surface/surfaceOrient/surfaceOrient.C index 4dad7dd57019647cb595d9f859b064ed0ebcacf4..fe0944a69a345178ee468025e02ae89ff7cf9c59 100644 --- a/applications/utilities/surface/surfaceOrient/surfaceOrient.C +++ b/applications/utilities/surface/surfaceOrient/surfaceOrient.C @@ -63,6 +63,12 @@ int main(int argc, char *argv[]) "usePierceTest", "determine orientation by counting number of intersections" ); + argList::addOption + ( + "scale", + "factor", + "input geometry scaling factor" + ); argList args(argc, argv); @@ -86,11 +92,14 @@ int main(int argc, char *argv[]) Info<< "outside" << endl; } - + const scalar scaling = args.optionLookupOrDefault<scalar>("scale", -1); + if (scaling > 0) + { + Info<< "Input scaling: " << scaling << nl; + } // Load surface - triSurface surf(surfFileName); - + triSurface surf(surfFileName, scaling); bool anyFlipped = false; @@ -118,11 +127,11 @@ int main(int argc, char *argv[]) if (anyFlipped) { - Info<< "Flipped orientation of (part of) surface." << endl; + Info<< "Flipped orientation of (part of) surface." << nl; } else { - Info<< "Did not flip orientation of any triangle of surface." << endl; + Info<< "Did not flip orientation of any triangle of surface." << nl; } Info<< "Writing new surface to " << outFileName << endl; diff --git a/applications/utilities/surface/surfacePointMerge/surfacePointMerge.C b/applications/utilities/surface/surfacePointMerge/surfacePointMerge.C index 830e861654cfbd3dc203b6a42aa6fd01f26ae728..ec3fe22c4ab9c240c8648b9d7d8afc3acdd480ae 100644 --- a/applications/utilities/surface/surfacePointMerge/surfacePointMerge.C +++ b/applications/utilities/surface/surfacePointMerge/surfacePointMerge.C @@ -46,31 +46,47 @@ using namespace Foam; int main(int argc, char *argv[]) { + argList::addNote + ( + "Merge points on surface if they are within absolute distance [m]." + ); argList::noParallel(); argList::validArgs.append("surfaceFile"); argList::validArgs.append("merge distance"); argList::validArgs.append("output surfaceFile"); + + argList::addOption + ( + "scale", + "factor", + "input geometry scaling factor" + ); + argList args(argc, argv); const fileName surfFileName = args[1]; const scalar mergeTol = args.argRead<scalar>(2); const fileName outFileName = args[3]; - Info<< "Reading surface from " << surfFileName << " ..." << endl; - Info<< "Merging points within " << mergeTol << " metre." << endl; + const scalar scaling = args.optionLookupOrDefault<scalar>("scale", -1); - triSurface surf1(surfFileName); + Info<< "Reading surface from " << surfFileName << " ..." << nl + << "Merging points within " << mergeTol << " metre." << nl; + if (scaling > 0) + { + Info<< "input scaling " << scaling << nl; + } - Info<< "Original surface:" << endl; + const triSurface surf1(surfFileName, scaling); + Info<< "Original surface:" << nl; surf1.writeStats(Info); - triSurface cleanSurf(surf1); while (true) { - label nOldVert = cleanSurf.nPoints(); + const label nOldVert = cleanSurf.nPoints(); cleanSurf = triSurfaceTools::mergePoints(cleanSurf, mergeTol); diff --git a/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C b/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C index 219a4552090ae138d363cffc6d64b4faeca9e336..5848349313327a583ef561318727fbafd3c6f20d 100644 --- a/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C +++ b/applications/utilities/surface/surfaceRedistributePar/surfaceRedistributePar.C @@ -105,7 +105,8 @@ int main(int argc, char *argv[]) argList::addNote ( "Redistribute a triSurface. " - "The specified surface must be located in the constant/triSurface directory" + "The specified surface must be located in the constant/triSurface " + "directory" ); argList::validArgs.append("triSurfaceMesh"); diff --git a/applications/utilities/surface/surfaceTransformPoints/surfaceTransformPoints.C b/applications/utilities/surface/surfaceTransformPoints/surfaceTransformPoints.C index dcfb66f61befcb3c42463bb4da2aef2b887844f9..36ae2631c48c52dcfa827eb19202f64541f69827 100644 --- a/applications/utilities/surface/surfaceTransformPoints/surfaceTransformPoints.C +++ b/applications/utilities/surface/surfaceTransformPoints/surfaceTransformPoints.C @@ -85,9 +85,9 @@ int main(int argc, char *argv[]) argList::addOption ( "scale", - "vector", - "scale by the specified amount - eg, '(0.001 0.001 0.001)' for a " - "uniform [mm] to [m] scaling" + "scalar | vector", + "scale by the specified amount - eg, for a uniform [mm] to [m] scaling " + "use either (0.001 0.001 0.001)' or simply '0.001'" ); argList::addOption ( @@ -138,7 +138,7 @@ int main(int argc, char *argv[]) n1n2[0] /= mag(n1n2[0]); n1n2[1] /= mag(n1n2[1]); - tensor T = rotationTensor(n1n2[0], n1n2[1]); + const tensor T = rotationTensor(n1n2[0], n1n2[1]); Info<< "Rotating points by " << T << endl; @@ -151,10 +151,10 @@ int main(int argc, char *argv[]) << " pitch " << v.y() << nl << " yaw " << v.z() << nl; - // Convert to radians + // degToRad v *= pi/180.0; - quaternion R(quaternion::rotationSequence::XYZ, v); + const quaternion R(quaternion::rotationSequence::XYZ, v); Info<< "Rotating points by quaternion " << R << endl; points = transform(R, points); @@ -166,29 +166,43 @@ int main(int argc, char *argv[]) << " pitch " << v.y() << nl << " roll " << v.z() << nl; - - // Convert to radians + // degToRad v *= pi/180.0; - scalar yaw = v.x(); - scalar pitch = v.y(); - scalar roll = v.z(); - - quaternion R = quaternion(vector(0, 0, 1), yaw); - R *= quaternion(vector(0, 1, 0), pitch); - R *= quaternion(vector(1, 0, 0), roll); + const quaternion R(quaternion::rotationSequence::ZYX, v); Info<< "Rotating points by quaternion " << R << endl; points = transform(R, points); } - if (args.optionReadIfPresent("scale", v)) + if (args.optionFound("scale")) { - Info<< "Scaling points by " << v << endl; - - points.replace(vector::X, v.x()*points.component(vector::X)); - points.replace(vector::Y, v.y()*points.component(vector::Y)); - points.replace(vector::Z, v.z()*points.component(vector::Z)); + // Use readList to handle single or multiple values + const List<scalar> scaling = args.optionReadList<scalar>("scale"); + + if (scaling.size() == 1) + { + Info<< "Scaling points uniformly by " << scaling[0] << nl; + points *= scaling[0]; + } + else if (scaling.size() == 3) + { + Info<< "Scaling points by (" + << scaling[0] << " " + << scaling[1] << " " + << scaling[2] << ")" << nl; + + points.replace(vector::X, scaling[0]*points.component(vector::X)); + points.replace(vector::Y, scaling[1]*points.component(vector::Y)); + points.replace(vector::Z, scaling[2]*points.component(vector::Z)); + } + else + { + FatalError + << "-scale with 1 or 3 components only" << nl + << "given: " << args["scale"] << endl + << exit(FatalError); + } } surf1.movePoints(points); diff --git a/src/conversion/common/writer/meshWriter.H b/src/conversion/common/writer/meshWriter.H index d17322fde0754480c3eb7a2a6864fba89b318d6f..5aedb05cdfb7548aebd1d2dd76ad14587aaf0ab5 100644 --- a/src/conversion/common/writer/meshWriter.H +++ b/src/conversion/common/writer/meshWriter.H @@ -125,7 +125,8 @@ public: // Constructors - //- Create a writer object with given output scaling + //- Create a writer object with given output scaling. + // Treats a zero or negative scale factor as unity scaling. meshWriter ( const polyMesh&, diff --git a/src/conversion/fire/FIREMeshWriter.H b/src/conversion/fire/FIREMeshWriter.H index 7d61a0461eb9a585787174f1d8cba60a1b308690..66294b068c77b140172cb8c60825679522c99e03 100644 --- a/src/conversion/fire/FIREMeshWriter.H +++ b/src/conversion/fire/FIREMeshWriter.H @@ -97,7 +97,8 @@ public: // Constructors - //- Prepare for writing, optionally with scaling + //- Prepare for writing, optionally with scaling. + // Treats a zero or negative scale factor as unity scaling. FIREMeshWriter(const polyMesh&, const scalar scaleFactor = 1.0); diff --git a/src/meshTools/triSurface/triSurfaceLoader/triSurfaceLoader.C b/src/meshTools/triSurface/triSurfaceLoader/triSurfaceLoader.C index a653f53bae09b1857ec7cc88e5ef3ce80431c5dd..8390c94c74c775e01a238b42ded220f4e4626b9b 100644 --- a/src/meshTools/triSurface/triSurfaceLoader/triSurfaceLoader.C +++ b/src/meshTools/triSurface/triSurfaceLoader/triSurfaceLoader.C @@ -218,7 +218,8 @@ Foam::label Foam::triSurfaceLoader::select(const wordReList& matcher) Foam::autoPtr<Foam::triSurface> Foam::triSurfaceLoader::load ( - const enum loadingOption opt + const enum loadingOption opt, + const scalar scaleFactor ) const { autoPtr<triSurface> output; @@ -229,7 +230,8 @@ Foam::autoPtr<Foam::triSurface> Foam::triSurfaceLoader::load } else if (selected_.size() == 1) { - output.set(new triSurface(directory_/selected_[0])); + // Use scaling (if any) + output.set(new triSurface(directory_/selected_[0], scaleFactor)); triSurface& surf = output(); @@ -392,6 +394,12 @@ Foam::autoPtr<Foam::triSurface> Foam::triSurfaceLoader::load } } + // Apply scaling (if any) + if (scaleFactor > VSMALL) + { + points *= scaleFactor; + } + output.set(new triSurface(faces, patches, points, true)); return output; diff --git a/src/meshTools/triSurface/triSurfaceLoader/triSurfaceLoader.H b/src/meshTools/triSurface/triSurfaceLoader/triSurfaceLoader.H index 7332026f765d7f6d74dc7ceb78ed6d36b78c845c..c8a0f62493fd7299f2b26d68b857e01de9c37cc1 100644 --- a/src/meshTools/triSurface/triSurfaceLoader/triSurfaceLoader.H +++ b/src/meshTools/triSurface/triSurfaceLoader/triSurfaceLoader.H @@ -154,9 +154,12 @@ public: label select(const wordReList& matcher); //- Load a single file, or load and combine multiple selected files + // Optionally scale the surface(s) on input, with a zero or negative + // scale factor treated as no scaling. autoPtr<triSurface> load ( - const enum loadingOption opt = loadingOption::OFFSET_REGION + const enum loadingOption opt = loadingOption::OFFSET_REGION, + const scalar scaleFactor = -1 ) const; }; diff --git a/src/surfMesh/triSurface/triSurface.C b/src/surfMesh/triSurface/triSurface.C index b9958febf44118e34872bb3b3edb2cb0cbbd294d..921e410593e0cc349c38068b423f3baf6821e8d4 100644 --- a/src/surfMesh/triSurface/triSurface.C +++ b/src/surfMesh/triSurface/triSurface.C @@ -760,17 +760,19 @@ Foam::triSurface::triSurface } -Foam::triSurface::triSurface(const fileName& name) +Foam::triSurface::triSurface(const fileName& name, const scalar scaleFactor) : ParentType(List<Face>(), pointField()), patches_(), sortedEdgeFacesPtr_(nullptr), edgeOwnerPtr_(nullptr) { - word ext = name.ext(); + const word ext = name.ext(); read(name, ext); + scalePoints(scaleFactor); + setDefaultPatches(); } @@ -886,8 +888,8 @@ void Foam::triSurface::movePoints(const pointField& newPoints) void Foam::triSurface::scalePoints(const scalar scaleFactor) { - // avoid bad scaling - if (scaleFactor > 0 && scaleFactor != 1.0) + // Avoid bad scaling + if (scaleFactor > VSMALL && scaleFactor != 1.0) { // Remove all geometry dependent data clearTopology(); diff --git a/src/surfMesh/triSurface/triSurface.H b/src/surfMesh/triSurface/triSurface.H index 24f8b5183787adbfe13ccea8a4f23a415bd22f29..a9ac604d56a9248df30710240b7fc5d00b195730 100644 --- a/src/surfMesh/triSurface/triSurface.H +++ b/src/surfMesh/triSurface/triSurface.H @@ -264,46 +264,55 @@ public: //- Construct from triangles, patches, points. triSurface ( - const List<labelledTri>&, - const geometricSurfacePatchList&, - const pointField& + const List<labelledTri>& triangles, + const geometricSurfacePatchList& patches, + const pointField& points ); //- Construct from triangles, patches, points. Reuse storage. triSurface ( - List<labelledTri>&, - const geometricSurfacePatchList&, - pointField&, + List<labelledTri>& triangles, + const geometricSurfacePatchList& patches, + pointField& points, const bool reuse ); //- Construct by transferring (triangles, points) components. triSurface ( - const Xfer<List<labelledTri>>&, - const geometricSurfacePatchList&, - const Xfer<List<point>>& + const Xfer<List<labelledTri>>& triangles, + const geometricSurfacePatchList& patches, + const Xfer<List<point>>& points ); //- Construct from triangles, points. Set patch names to default. - triSurface(const List<labelledTri>&, const pointField&); + triSurface + ( + const List<labelledTri>& triangles, + const pointField& points + ); //- Construct from triangles, points. Set region to 0 and default // patchName. - triSurface(const triFaceList&, const pointField&); + triSurface + ( + const triFaceList& triangles, + const pointField& points + ); - //- Construct from file name (uses extension to determine type) - triSurface(const fileName&); + //- Construct from file name (uses extension to determine type). + // Optional (positive, non-zero) point scaling is possible. + triSurface(const fileName& name, const scalar scaleFactor = -1); //- Construct from Istream - triSurface(Istream&); + triSurface(Istream& is); //- Construct from objectRegistry triSurface(const Time& d); //- Construct as copy - triSurface(const triSurface&); + triSurface(const triSurface& ts); //- Destructor @@ -382,10 +391,10 @@ public: // Edit //- Move points - virtual void movePoints(const pointField&); + virtual void movePoints(const pointField& newPoints); - //- Scale points. A non-positive factor is ignored - virtual void scalePoints(const scalar); + //- Scale points. A non-positive factor is ignored. + virtual void scalePoints(const scalar scaleFactor); //- Check/remove duplicate/degenerate triangles void checkTriangles(const bool verbose); @@ -447,13 +456,13 @@ public: // Write //- Write to Ostream in simple FOAM format - void write(Ostream&) const; + void write(Ostream& os) const; //- Generic write routine. Chooses writer based on extension. void write(const fileName&, const bool sortByRegion = false) const; //- Write to database - void write(const Time&) const; + void write(const Time& d) const; //- Write some statistics void writeStats(Ostream& os) const;