diff --git a/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C b/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C index c7cc9b862f..d5a21f396f 100644 --- a/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C +++ b/applications/utilities/surface/surfaceMeshConvertTesting/surfaceMeshConvertTesting.C @@ -102,8 +102,8 @@ int main(int argc, char *argv[]) if ( - !meshedSurface::canRead(importName, true) - || !meshedSurface::canWriteType(exportName.ext(), true) + !MeshedSurface::canRead(importName, true) + || !MeshedSurface::canWriteType(exportName.ext(), true) ) { return 1; diff --git a/applications/utilities/surface/surfaceMeshExport/Make/files b/applications/utilities/surface/surfaceMeshExport/Make/files new file mode 100644 index 0000000000..ea05f5bc24 --- /dev/null +++ b/applications/utilities/surface/surfaceMeshExport/Make/files @@ -0,0 +1,3 @@ +surfaceMeshExport.C + +EXE = $(FOAM_APPBIN)/surfaceMeshExport diff --git a/applications/utilities/surface/surfaceMeshExport/Make/options b/applications/utilities/surface/surfaceMeshExport/Make/options new file mode 100644 index 0000000000..42b30c8652 --- /dev/null +++ b/applications/utilities/surface/surfaceMeshExport/Make/options @@ -0,0 +1,5 @@ +EXE_INC = \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/surfMesh/lnInclude + +EXE_LIBS = -lmeshTools -lsurfMesh diff --git a/applications/utilities/surface/surfaceMeshExport/surfaceMeshExport.C b/applications/utilities/surface/surfaceMeshExport/surfaceMeshExport.C new file mode 100644 index 0000000000..0856ed6f82 --- /dev/null +++ b/applications/utilities/surface/surfaceMeshExport/surfaceMeshExport.C @@ -0,0 +1,277 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Application + surfaceMeshExport + +Description + Export from surfMesh to various third-party surface formats with + optional scaling or transformations (rotate/translate) on a + coordinateSystem. + +Usage + - surfaceMeshExport outputFile [OPTION] + + @param -clean \n + Perform some surface checking/cleanup on the input surface. + + @param -name \ \n + Specify an alternative surface name when writing. + + @param -scaleIn \ \n + Specify a scaling factor when reading files. + + @param -scaleOut \ \n + Specify a scaling factor when writing files. + + @param -dict \ \n + Specify an alternative dictionary for constant/coordinateSystems. + + @param -from \ \n + Specify a coordinate System when reading files. + + @param -to \ \n + Specify a coordinate System when writing files. + +Note + The filename extensions are used to determine the file format type. + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "timeSelector.H" +#include "Time.H" + +#include "MeshedSurfaces.H" +#include "coordinateSystems.H" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + argList::noParallel(); + argList::validArgs.append("outputFile"); + argList::validOptions.insert("name", "name"); + argList::validOptions.insert("clean", "scale"); + argList::validOptions.insert("scaleIn", "scale"); + argList::validOptions.insert("scaleOut", "scale"); + argList::validOptions.insert("dict", "coordinateSystemsDict"); + argList::validOptions.insert("from", "sourceCoordinateSystem"); + argList::validOptions.insert("to", "targetCoordinateSystem"); + + argList args(argc, argv); + Time runTime(args.rootPath(), args.caseName()); + const stringList& params = args.additionalArgs(); + + fileName exportName(params[0]); + word importName("default"); + + // check that writing is supported + if (!MeshedSurface::canWriteType(exportName.ext(), true)) + { + return 1; + } + + if (args.options().found("name")) + { + importName = args.options()["name"]; + } + + + // get the coordinate transformations + autoPtr fromCsys; + autoPtr toCsys; + + if (args.options().found("from") || args.options().found("to")) + { + autoPtr ioPtr; + + if (args.options().found("dict")) + { + fileName dictPath(args.options()["dict"]); + + ioPtr.set + ( + new IOobject + ( + ( + dictPath.isDir() + ? dictPath/coordinateSystems::typeName + : dictPath + ), + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ); + } + else + { + ioPtr.set + ( + new IOobject + ( + coordinateSystems::typeName, + runTime.constant(), + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ); + } + + + if (!ioPtr->headerOk()) + { + FatalErrorIn(args.executable()) + << "Cannot open coordinateSystems file\n " + << ioPtr->objectPath() << nl + << exit(FatalError); + } + + coordinateSystems csLst(ioPtr()); + + if (args.options().found("from")) + { + const word csName(args.options()["from"]); + + label csId = csLst.find(csName); + if (csId < 0) + { + FatalErrorIn(args.executable()) + << "Cannot find -from " << csName << nl + << "available coordinateSystems: " << csLst.toc() << nl + << exit(FatalError); + } + + fromCsys.reset(new coordinateSystem(csLst[csId])); + } + + if (args.options().found("to")) + { + const word csName(args.options()["to"]); + + label csId = csLst.find(csName); + if (csId < 0) + { + FatalErrorIn(args.executable()) + << "Cannot find -to " << csName << nl + << "available coordinateSystems: " << csLst.toc() << nl + << exit(FatalError); + } + + toCsys.reset(new coordinateSystem(csLst[csId])); + } + + + // maybe fix this later + if (fromCsys.valid() && toCsys.valid()) + { + FatalErrorIn(args.executable()) + << "Only allowed '-from' or '-to' option at the moment." + << exit(FatalError); + } + } + + + surfMesh smesh + ( + IOobject + ( + importName, + runTime.constant(), + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE + ) + ); + + Info<< "read surfMesh:\n " << smesh.objectPath() << endl; + + + // Simply copy for now, but really should have a separate write method + + MeshedSurface surf(smesh); + + if (args.options().found("clean")) + { + surf.cleanup(true); + } + + scalar scaleIn = 0; + scalar scaleOut = 0; + if (args.options().found("scaleIn")) + { + IStringStream(args.options()["scaleIn"])() >> scaleIn; + } + if (args.options().found("scaleOut")) + { + IStringStream(args.options()["scaleOut"])() >> scaleOut; + } + + + if (scaleIn > 0) + { + Info<< " -scaleIn " << scaleIn << endl; + surf.scalePoints(scaleIn); + } + + if (fromCsys.valid()) + { + Info<< " -from " << fromCsys().name() << endl; + tmp tpf = fromCsys().localPosition(surf.points()); + surf.movePoints(tpf()); + } + + if (toCsys.valid()) + { + Info<< " -to " << toCsys().name() << endl; + tmp tpf = toCsys().globalPosition(surf.points()); + surf.movePoints(tpf()); + } + + if (scaleOut > 0) + { + Info<< " -scaleOut " << scaleOut << endl; + surf.scalePoints(scaleOut); + } + + + surf.writeStats(Info); + Info<< endl; + + Info<< "writing " << exportName << endl; + surf.write(exportName); + + Info<< "\nEnd\n" << endl; + + return 0; +} + +// ************************************************************************* // diff --git a/applications/utilities/surface/surfaceMeshImport/Make/files b/applications/utilities/surface/surfaceMeshImport/Make/files new file mode 100644 index 0000000000..d1fb24d300 --- /dev/null +++ b/applications/utilities/surface/surfaceMeshImport/Make/files @@ -0,0 +1,3 @@ +surfaceMeshImport.C + +EXE = $(FOAM_APPBIN)/surfaceMeshImport diff --git a/applications/utilities/surface/surfaceMeshImport/Make/options b/applications/utilities/surface/surfaceMeshImport/Make/options new file mode 100644 index 0000000000..42b30c8652 --- /dev/null +++ b/applications/utilities/surface/surfaceMeshImport/Make/options @@ -0,0 +1,5 @@ +EXE_INC = \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/surfMesh/lnInclude + +EXE_LIBS = -lmeshTools -lsurfMesh diff --git a/applications/utilities/surface/surfaceMeshImport/surfaceMeshImport.C b/applications/utilities/surface/surfaceMeshImport/surfaceMeshImport.C new file mode 100644 index 0000000000..30f562f7f6 --- /dev/null +++ b/applications/utilities/surface/surfaceMeshImport/surfaceMeshImport.C @@ -0,0 +1,271 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM; if not, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Application + surfaceMeshImport + +Description + Import from various third-party surface formats into surfMesh + with optional scaling or transformations (rotate/translate) + on a coordinateSystem. + +Usage + - surfaceMeshImport inputFile [OPTION] + + @param -clean \n + Perform some surface checking/cleanup on the input surface. + + @param -name \ \n + Specify an alternative surface name when writing. + + @param -scaleIn \ \n + Specify a scaling factor when reading files. + + @param -scaleOut \ \n + Specify a scaling factor when writing files. + + @param -dict \ \n + Specify an alternative dictionary for constant/coordinateSystems. + + @param -from \ \n + Specify a coordinate System when reading files. + + @param -to \ \n + Specify a coordinate System when writing files. + +Note + The filename extensions are used to determine the file format type. + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "timeSelector.H" +#include "Time.H" + +#include "MeshedSurfaces.H" +#include "coordinateSystems.H" + +using namespace Foam; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + argList::noParallel(); + argList::validArgs.append("inputFile"); + argList::validOptions.insert("name", "name"); + argList::validOptions.insert("clean", "scale"); + argList::validOptions.insert("scaleIn", "scale"); + argList::validOptions.insert("scaleOut", "scale"); + argList::validOptions.insert("dict", "coordinateSystemsDict"); + argList::validOptions.insert("from", "sourceCoordinateSystem"); + argList::validOptions.insert("to", "targetCoordinateSystem"); + + argList args(argc, argv); + Time runTime(args.rootPath(), args.caseName()); + const stringList& params = args.additionalArgs(); + + fileName importName(params[0]); + word exportName("default"); + + // check that reading is supported + if (!MeshedSurface::canRead(importName, true)) + { + return 1; + } + + if (args.options().found("name")) + { + exportName = args.options()["name"]; + } + + + // get the coordinate transformations + autoPtr fromCsys; + autoPtr toCsys; + + if (args.options().found("from") || args.options().found("to")) + { + autoPtr ioPtr; + + if (args.options().found("dict")) + { + fileName dictPath(args.options()["dict"]); + + ioPtr.set + ( + new IOobject + ( + ( + dictPath.isDir() + ? dictPath/coordinateSystems::typeName + : dictPath + ), + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ); + } + else + { + ioPtr.set + ( + new IOobject + ( + coordinateSystems::typeName, + runTime.constant(), + runTime, + IOobject::MUST_READ, + IOobject::NO_WRITE, + false + ) + ); + } + + + if (!ioPtr->headerOk()) + { + FatalErrorIn(args.executable()) + << "Cannot open coordinateSystems file\n " + << ioPtr->objectPath() << nl + << exit(FatalError); + } + + coordinateSystems csLst(ioPtr()); + + if (args.options().found("from")) + { + const word csName(args.options()["from"]); + + label csId = csLst.find(csName); + if (csId < 0) + { + FatalErrorIn(args.executable()) + << "Cannot find -from " << csName << nl + << "available coordinateSystems: " << csLst.toc() << nl + << exit(FatalError); + } + + fromCsys.reset(new coordinateSystem(csLst[csId])); + } + + if (args.options().found("to")) + { + const word csName(args.options()["to"]); + + label csId = csLst.find(csName); + if (csId < 0) + { + FatalErrorIn(args.executable()) + << "Cannot find -to " << csName << nl + << "available coordinateSystems: " << csLst.toc() << nl + << exit(FatalError); + } + + toCsys.reset(new coordinateSystem(csLst[csId])); + } + + + // maybe fix this later + if (fromCsys.valid() && toCsys.valid()) + { + FatalErrorIn(args.executable()) + << "Only allowed '-from' or '-to' option at the moment." + << exit(FatalError); + } + } + + + + + MeshedSurface surf(importName); + + if (args.options().found("clean")) + { + surf.cleanup(true); + } + + + scalar scaleIn = 0; + scalar scaleOut = 0; + if (args.options().found("scaleIn")) + { + IStringStream(args.options()["scaleIn"])() >> scaleIn; + } + if (args.options().found("scaleOut")) + { + IStringStream(args.options()["scaleOut"])() >> scaleOut; + } + + + if (scaleIn > 0) + { + Info<< " -scaleIn " << scaleIn << endl; + surf.scalePoints(scaleIn); + } + + if (fromCsys.valid()) + { + Info<< " -from " << fromCsys().name() << endl; + tmp tpf = fromCsys().localPosition(surf.points()); + surf.movePoints(tpf()); + } + + if (toCsys.valid()) + { + Info<< " -to " << toCsys().name() << endl; + tmp tpf = toCsys().globalPosition(surf.points()); + surf.movePoints(tpf()); + } + + if (scaleOut > 0) + { + Info<< " -scaleOut " << scaleOut << endl; + surf.scalePoints(scaleOut); + } + + surfMesh smesh + ( + IOobject + ( + exportName, + runTime.constant(), + runTime + ), + surf.xfer() + ); + + + Info<< "writing surfMesh:\n " << smesh.objectPath() << endl; + smesh.write(); + + Info<< "\nEnd\n" << endl; + + return 0; +} + +// ************************************************************************* // diff --git a/src/surfMesh/BasicMeshedSurface/BasicMeshedSurface.C b/src/surfMesh/BasicMeshedSurface/BasicMeshedSurface.C index c495cb4afd..985453f6d3 100644 --- a/src/surfMesh/BasicMeshedSurface/BasicMeshedSurface.C +++ b/src/surfMesh/BasicMeshedSurface/BasicMeshedSurface.C @@ -532,10 +532,35 @@ void Foam::BasicMeshedSurface::remapFaces(const UList