mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
Merge branch 'feature-trisurface-cleanup' into 'develop'
consolidate surfaceFormats for reading/writing triSurface See merge request Development/OpenFOAM-plus!174
This commit is contained in:
@ -64,7 +64,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
argList::addNote
|
||||
(
|
||||
"convert between surface formats"
|
||||
"convert between surface formats, using triSurface library components"
|
||||
);
|
||||
|
||||
argList::noParallel();
|
||||
@ -96,16 +96,6 @@ int main(int argc, char *argv[])
|
||||
|
||||
argList args(argc, argv);
|
||||
|
||||
if (args.optionFound("writePrecision"))
|
||||
{
|
||||
label writePrecision = args.optionRead<label>("writePrecision");
|
||||
|
||||
IOstream::defaultPrecision(writePrecision);
|
||||
Sout.precision(writePrecision);
|
||||
|
||||
Info<< "Output write precision set to " << writePrecision << endl;
|
||||
}
|
||||
|
||||
const fileName importName = args[1];
|
||||
const fileName exportName = args[2];
|
||||
|
||||
@ -116,6 +106,26 @@ int main(int argc, char *argv[])
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
// Check that reading/writing is supported
|
||||
if
|
||||
(
|
||||
!triSurface::canRead(importName, true)
|
||||
|| !triSurface::canWriteType(exportName.ext(), true)
|
||||
)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (args.optionFound("writePrecision"))
|
||||
{
|
||||
label writePrecision = args.optionRead<label>("writePrecision");
|
||||
|
||||
IOstream::defaultPrecision(writePrecision);
|
||||
Sout.precision(writePrecision);
|
||||
|
||||
Info<< "Output write precision set to " << writePrecision << endl;
|
||||
}
|
||||
|
||||
const scalar scaleFactor = args.optionLookupOrDefault<scalar>("scale", -1);
|
||||
|
||||
Info<< "Reading : " << importName << endl;
|
||||
|
||||
@ -75,7 +75,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
argList::addNote
|
||||
(
|
||||
"convert between surface formats"
|
||||
"convert between surface formats, using MeshSurface library components"
|
||||
);
|
||||
|
||||
argList::noParallel();
|
||||
@ -133,7 +133,7 @@ int main(int argc, char *argv[])
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
// check that reading/writing is supported
|
||||
// Check that reading/writing is supported
|
||||
if
|
||||
(
|
||||
!MeshedSurface<face>::canRead(importName, true)
|
||||
|
||||
@ -288,6 +288,10 @@ public:
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Suppress direct swapping, since storage containers may be const
|
||||
void swap(PrimitivePatch&) = delete;
|
||||
|
||||
|
||||
// Access
|
||||
|
||||
//- Return reference to global points
|
||||
@ -320,9 +324,9 @@ public:
|
||||
label nInternalEdges() const;
|
||||
|
||||
//- Is internal edge?
|
||||
bool isInternalEdge(const label edgeI) const
|
||||
bool isInternalEdge(const label edgei) const
|
||||
{
|
||||
return edgeI < nInternalEdges();
|
||||
return edgei < nInternalEdges();
|
||||
}
|
||||
|
||||
//- Return list of boundary points,
|
||||
|
||||
@ -365,13 +365,18 @@ namespace stringOps
|
||||
const std::string& delim
|
||||
);
|
||||
|
||||
//- Split string into sub-strings using a fixed field width
|
||||
//- Split string into sub-strings using a fixed field width.
|
||||
// Behaviour is ill-defined if width is zero.
|
||||
// \param str the string to be split
|
||||
// \param width the fixed field width for each sub-string
|
||||
// \param start the optional offset of where to start the splitting.
|
||||
// Any text prior to start is ignored in the operation.
|
||||
template<class StringType>
|
||||
Foam::SubStrings<StringType> splitFixed
|
||||
(
|
||||
const StringType& str,
|
||||
const std::string::size_type width
|
||||
const std::string::size_type width,
|
||||
const std::string::size_type start = 0
|
||||
);
|
||||
|
||||
//- Split string into sub-strings at whitespace (TAB, NL, VT, FF, CR, SPC)
|
||||
|
||||
@ -183,7 +183,8 @@ template<class StringType>
|
||||
Foam::SubStrings<StringType> Foam::stringOps::splitFixed
|
||||
(
|
||||
const StringType& str,
|
||||
const std::string::size_type width
|
||||
const std::string::size_type width,
|
||||
const std::string::size_type start
|
||||
)
|
||||
{
|
||||
Foam::SubStrings<StringType> lst;
|
||||
@ -195,7 +196,7 @@ Foam::SubStrings<StringType> Foam::stringOps::splitFixed
|
||||
const auto len = str.size();
|
||||
lst.reserve(1 + (len / width));
|
||||
|
||||
for (std::string::size_type pos = 0; pos < len; pos += width)
|
||||
for (std::string::size_type pos = start; pos < len; pos += width)
|
||||
{
|
||||
const auto end = (pos + width);
|
||||
|
||||
|
||||
@ -40,12 +40,6 @@ Foam::fileFormats::FIRECore::file3dExtensions
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::FIRECore::FIRECore()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * //
|
||||
|
||||
Foam::label Foam::fileFormats::FIRECore::readPoints
|
||||
|
||||
@ -108,7 +108,7 @@ protected:
|
||||
// Protected Member Functions
|
||||
|
||||
//- Construct null
|
||||
FIRECore();
|
||||
FIRECore() = default;
|
||||
|
||||
|
||||
//- Read points.
|
||||
|
||||
@ -2,8 +2,8 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -24,11 +24,27 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "NASCore.H"
|
||||
#include "IOmanip.H"
|
||||
#include "Ostream.H"
|
||||
#include "parsing.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
const Foam::Enum
|
||||
<
|
||||
Foam::fileFormats::NASCore::fieldFormat
|
||||
>
|
||||
Foam::fileFormats::NASCore::fieldFormatNames
|
||||
{
|
||||
{ fieldFormat::SHORT, "short" },
|
||||
{ fieldFormat::LONG, "long" },
|
||||
{ fieldFormat::FREE, "free" },
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
||||
|
||||
Foam::scalar Foam::fileFormats::NASCore::readNasScalar(const string& str)
|
||||
Foam::scalar Foam::fileFormats::NASCore::readNasScalar(const std::string& str)
|
||||
{
|
||||
const auto signPos = str.find_last_of("+-");
|
||||
|
||||
@ -54,7 +70,7 @@ Foam::scalar Foam::fileFormats::NASCore::readNasScalar(const string& str)
|
||||
if
|
||||
(
|
||||
readScalar(str.substr(0, signPos), value) // Mantissa
|
||||
&& readInt(str.substr(signPos), exponent) // Exponent (with sign)
|
||||
&& readInt(str.substr(signPos), exponent) // Exponent (with sign)
|
||||
)
|
||||
{
|
||||
// Note: this does not catch underflow/overflow
|
||||
@ -74,10 +90,98 @@ Foam::scalar Foam::fileFormats::NASCore::readNasScalar(const string& str)
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
std::string Foam::fileFormats::NASCore::nextNasField
|
||||
(
|
||||
const std::string& str,
|
||||
std::string::size_type& pos,
|
||||
std::string::size_type len
|
||||
)
|
||||
{
|
||||
const auto beg = pos;
|
||||
const auto end = str.find(',', pos);
|
||||
|
||||
Foam::fileFormats::NASCore::NASCore()
|
||||
{}
|
||||
if (end == std::string::npos)
|
||||
{
|
||||
pos = beg + len; // Continue after field width
|
||||
}
|
||||
else
|
||||
{
|
||||
len = (end - beg); // Efffective width
|
||||
pos = end + 1; // Continue after comma
|
||||
}
|
||||
|
||||
return str.substr(beg, len);
|
||||
}
|
||||
|
||||
|
||||
void Foam::fileFormats::NASCore::setPrecision
|
||||
(
|
||||
Ostream& os,
|
||||
const fieldFormat format
|
||||
)
|
||||
{
|
||||
os.setf(ios_base::scientific);
|
||||
|
||||
// Capitalise the E marker
|
||||
os.setf(ios_base::uppercase);
|
||||
|
||||
const label offset = 7;
|
||||
|
||||
label prec = 16 - offset;
|
||||
switch (format)
|
||||
{
|
||||
case fieldFormat::SHORT :
|
||||
{
|
||||
prec = 8 - offset;
|
||||
break;
|
||||
}
|
||||
|
||||
case fieldFormat::LONG :
|
||||
case fieldFormat::FREE :
|
||||
{
|
||||
prec = 16 - offset;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
os.precision(prec);
|
||||
}
|
||||
|
||||
|
||||
Foam::Ostream& Foam::fileFormats::NASCore::writeKeyword
|
||||
(
|
||||
Ostream& os,
|
||||
const word& keyword,
|
||||
const fieldFormat format
|
||||
)
|
||||
{
|
||||
os.setf(ios_base::left);
|
||||
|
||||
switch (format)
|
||||
{
|
||||
case fieldFormat::SHORT :
|
||||
{
|
||||
os << setw(8) << keyword;
|
||||
break;
|
||||
}
|
||||
|
||||
case fieldFormat::LONG :
|
||||
{
|
||||
os << setw(8) << word(keyword + '*');
|
||||
break;
|
||||
}
|
||||
|
||||
case fieldFormat::FREE :
|
||||
{
|
||||
os << keyword;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
os.unsetf(ios_base::left);
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -2,8 +2,8 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -37,11 +37,16 @@ SourceFiles
|
||||
|
||||
#include "scalar.H"
|
||||
#include "string.H"
|
||||
#include "Enum.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// Forward declarations
|
||||
class Ostream;
|
||||
|
||||
namespace fileFormats
|
||||
{
|
||||
|
||||
@ -53,23 +58,64 @@ class NASCore
|
||||
{
|
||||
public:
|
||||
|
||||
// Public Member Functions
|
||||
|
||||
//- Extract numbers from things like "-2.358-8" (same as "-2.358e-8")
|
||||
static scalar readNasScalar(const string& str);
|
||||
|
||||
//- Extract numbers from things like "-2.358-8" (same as "-2.358e-8")
|
||||
// \deprecated use readNasScalar instead (deprecated Sep 2017)
|
||||
inline static scalar parseNASCoord(const string& str)
|
||||
//- File field formats
|
||||
enum fieldFormat
|
||||
{
|
||||
return readNasScalar(str);
|
||||
}
|
||||
SHORT, //<! Short format (field width = 8)
|
||||
LONG, //<! Long format (field width = 16)
|
||||
FREE //<! Free format (comma-separated fields)
|
||||
};
|
||||
|
||||
//- Selection names for the NASTRAN file field formats
|
||||
static const Enum<fieldFormat> fieldFormatNames;
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
NASCore();
|
||||
NASCore() = default;
|
||||
|
||||
|
||||
// Public Static Member Functions
|
||||
|
||||
//- Extract numbers from things like "-2.358-8" (same as "-2.358e-8")
|
||||
static scalar readNasScalar(const std::string& str);
|
||||
|
||||
//- Extract numbers from things like "-2.358-8" (same as "-2.358e-8")
|
||||
// \deprecated use readNasScalar instead (deprecated Sep 2017)
|
||||
inline static scalar parseNASCoord(const std::string& str)
|
||||
{
|
||||
return readNasScalar(str);
|
||||
}
|
||||
|
||||
//- A string::substr() to handle fixed-format and free-format NASTRAN.
|
||||
// Returns the substr to the next comma (if found) or the given length
|
||||
//
|
||||
// \param str The string to extract from
|
||||
// \param pos On input, the position of the first character of the
|
||||
// substring. On output, advances to the next position to use.
|
||||
// \param len The fixed-format length to use if a comma is not found.
|
||||
static std::string nextNasField
|
||||
(
|
||||
const std::string& str,
|
||||
std::string::size_type& pos,
|
||||
std::string::size_type len
|
||||
);
|
||||
|
||||
|
||||
//- Set output stream precision and format flags
|
||||
static void setPrecision(Ostream& os, const fieldFormat format);
|
||||
|
||||
|
||||
//- Write initial keyword (eg, 'GRID' or 'GRID*') followed by the
|
||||
//- requisite number of spaces for the field-width
|
||||
static Ostream& writeKeyword
|
||||
(
|
||||
Ostream& os,
|
||||
const word& keyword,
|
||||
const fieldFormat format
|
||||
);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -27,6 +27,7 @@ License
|
||||
#include "ListOps.H"
|
||||
#include "clock.H"
|
||||
#include "PackedBoolList.H"
|
||||
#include "DynamicList.H"
|
||||
#include "StringStream.H"
|
||||
#include "OSspecific.H"
|
||||
|
||||
@ -85,12 +86,6 @@ Foam::fileFormats::STARCDCore::starToFoamFaceAddr =
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::STARCDCore::STARCDCore()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * //
|
||||
|
||||
bool Foam::fileFormats::STARCDCore::readHeader
|
||||
@ -173,8 +168,8 @@ void Foam::fileFormats::STARCDCore::removeFiles(const fileName& base)
|
||||
Foam::label Foam::fileFormats::STARCDCore::readPoints
|
||||
(
|
||||
IFstream& is,
|
||||
pointField& points,
|
||||
labelList& ids
|
||||
List<point>& points,
|
||||
List<label>& ids
|
||||
)
|
||||
{
|
||||
label maxId = 0;
|
||||
@ -219,7 +214,7 @@ Foam::label Foam::fileFormats::STARCDCore::readPoints
|
||||
void Foam::fileFormats::STARCDCore::writePoints
|
||||
(
|
||||
Ostream& os,
|
||||
const pointField& points,
|
||||
const UList<point>& points,
|
||||
const scalar scaleFactor
|
||||
)
|
||||
{
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -37,9 +37,10 @@ SourceFiles
|
||||
|
||||
#include "IFstream.H"
|
||||
#include "Enum.H"
|
||||
#include "pointField.H"
|
||||
#include "Map.H"
|
||||
#include "point.H"
|
||||
#include "FixedList.H"
|
||||
#include "List.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -133,13 +134,13 @@ protected:
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
STARCDCore();
|
||||
STARCDCore() = default;
|
||||
|
||||
//- Read header and check signature PROSTAR_(CELL|VERTEX|BOUNDARY)
|
||||
static bool readHeader(IFstream&, const enum fileHeader);
|
||||
static bool readHeader(IFstream& is, const enum fileHeader header);
|
||||
|
||||
//- Write header for fileType (CELL|VERTEX|BOUNDARY)
|
||||
static void writeHeader(Ostream&, const enum fileHeader);
|
||||
static void writeHeader(Ostream& os, const enum fileHeader header);
|
||||
|
||||
|
||||
public:
|
||||
@ -150,7 +151,7 @@ public:
|
||||
static fileName starFileName
|
||||
(
|
||||
const fileName& baseName,
|
||||
const enum fileExt
|
||||
const enum fileExt ext
|
||||
);
|
||||
|
||||
|
||||
@ -173,16 +174,16 @@ public:
|
||||
// \endverbatim
|
||||
static label readPoints
|
||||
(
|
||||
IFstream&,
|
||||
pointField&,
|
||||
labelList& ids
|
||||
IFstream& is,
|
||||
List<point>& points,
|
||||
List<label>& ids
|
||||
);
|
||||
|
||||
//- Write header and points to (.vrt) file, optionally with scaling
|
||||
static void writePoints
|
||||
(
|
||||
Ostream&,
|
||||
const pointField&,
|
||||
Ostream& os,
|
||||
const UList<point>& points,
|
||||
const scalar scaleFactor = 1.0
|
||||
);
|
||||
|
||||
|
||||
@ -59,21 +59,20 @@ static bool startsWithSolid(const char header[STLHeaderSize])
|
||||
//! \endcond
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::STLCore::STLCore()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
bool Foam::fileFormats::STLCore::isBinaryName
|
||||
(
|
||||
const fileName& filename,
|
||||
const STLFormat& format
|
||||
const STLFormat format
|
||||
)
|
||||
{
|
||||
return (format == UNKNOWN ? (filename.ext() == "stlb") : format == BINARY);
|
||||
return
|
||||
(
|
||||
format == STLFormat::UNKNOWN
|
||||
? (filename.ext() == "stlb")
|
||||
: format == STLFormat::BINARY
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -69,11 +69,12 @@ protected:
|
||||
|
||||
// Protected Member Functions
|
||||
|
||||
//- Detect 'stlb' extension as binary
|
||||
//- Detect 'stlb' extension as binary when format = UNKNOWN.
|
||||
// Otherwise test if format == BINARY.
|
||||
static bool isBinaryName
|
||||
(
|
||||
const fileName& filename,
|
||||
const STLFormat& format
|
||||
const STLFormat format
|
||||
);
|
||||
|
||||
|
||||
@ -98,7 +99,7 @@ protected:
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
STLCore();
|
||||
STLCore() = default;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -38,7 +38,7 @@ bool Foam::fileFormats::STLReader::readBINARY
|
||||
)
|
||||
{
|
||||
sorted_ = true;
|
||||
format_ = UNKNOWN;
|
||||
format_ = STLFormat::UNKNOWN;
|
||||
|
||||
label nTris = 0;
|
||||
autoPtr<istream> streamPtr = readBinaryHeader(filename, nTris);
|
||||
@ -125,7 +125,7 @@ bool Foam::fileFormats::STLReader::readBINARY
|
||||
names_.clear();
|
||||
sizes_.transfer(dynSizes);
|
||||
|
||||
format_ = BINARY;
|
||||
format_ = STLFormat::BINARY;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -133,10 +133,15 @@ bool Foam::fileFormats::STLReader::readBINARY
|
||||
bool Foam::fileFormats::STLReader::readFile
|
||||
(
|
||||
const fileName& filename,
|
||||
const STLFormat& format
|
||||
const STLFormat format
|
||||
)
|
||||
{
|
||||
if (format == UNKNOWN ? detectBinaryHeader(filename) : format == BINARY)
|
||||
if
|
||||
(
|
||||
format == STLFormat::UNKNOWN
|
||||
? detectBinaryHeader(filename)
|
||||
: format == STLFormat::BINARY
|
||||
)
|
||||
{
|
||||
return readBINARY(filename);
|
||||
}
|
||||
@ -159,17 +164,17 @@ Foam::fileFormats::STLReader::STLReader
|
||||
zoneIds_(),
|
||||
names_(),
|
||||
sizes_(),
|
||||
format_(STLCore::UNKNOWN)
|
||||
format_(STLFormat::UNKNOWN)
|
||||
{
|
||||
// Auto-detect ASCII/BINARY format
|
||||
readFile(filename, STLCore::UNKNOWN);
|
||||
readFile(filename, STLFormat::UNKNOWN);
|
||||
}
|
||||
|
||||
|
||||
Foam::fileFormats::STLReader::STLReader
|
||||
(
|
||||
const fileName& filename,
|
||||
const STLFormat& format
|
||||
const STLFormat format
|
||||
)
|
||||
:
|
||||
sorted_(true),
|
||||
@ -177,7 +182,7 @@ Foam::fileFormats::STLReader::STLReader
|
||||
zoneIds_(),
|
||||
names_(),
|
||||
sizes_(),
|
||||
format_(STLCore::UNKNOWN)
|
||||
format_(STLFormat::UNKNOWN)
|
||||
{
|
||||
// Manually specified ASCII/BINARY format
|
||||
readFile(filename, format);
|
||||
@ -199,7 +204,7 @@ void Foam::fileFormats::STLReader::clear()
|
||||
zoneIds_.clear();
|
||||
names_.clear();
|
||||
sizes_.clear();
|
||||
format_ = UNKNOWN;
|
||||
format_ = STLFormat::UNKNOWN;
|
||||
}
|
||||
|
||||
|
||||
@ -215,7 +220,7 @@ Foam::label Foam::fileFormats::STLReader::mergePointsMap
|
||||
|
||||
return mergePointsMap
|
||||
(
|
||||
(format_ == BINARY ? 10 : 100) * doubleScalarSMALL,
|
||||
(format_ == STLFormat::BINARY ? 10 : 100) * doubleScalarSMALL,
|
||||
pointMap
|
||||
);
|
||||
}
|
||||
|
||||
@ -85,7 +85,7 @@ class STLReader
|
||||
bool readBINARY(const fileName& filename);
|
||||
|
||||
//- Read ASCII or BINARY
|
||||
bool readFile(const fileName& filename, const STLFormat& format);
|
||||
bool readFile(const fileName& filename, const STLFormat format);
|
||||
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
@ -105,7 +105,7 @@ public:
|
||||
|
||||
//- Read from file, filling in the information.
|
||||
// Manually selected choice of ASCII/BINARY/UNKNOWN(detect) formats.
|
||||
STLReader(const fileName& filename, const STLFormat& format);
|
||||
STLReader(const fileName& filename, const STLFormat format);
|
||||
|
||||
|
||||
//- Destructor
|
||||
|
||||
@ -411,7 +411,7 @@ bool Foam::fileFormats::STLReader::readASCII
|
||||
const fileName& filename
|
||||
)
|
||||
{
|
||||
format_ = UNKNOWN;
|
||||
format_ = STLFormat::UNKNOWN;
|
||||
|
||||
IFstream is(filename);
|
||||
if (!is)
|
||||
@ -434,7 +434,7 @@ bool Foam::fileFormats::STLReader::readASCII
|
||||
names_.transfer(lexer.names());
|
||||
sizes_.transfer(lexer.sizes());
|
||||
|
||||
format_ = ASCII;
|
||||
format_ = STLFormat::ASCII;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -44,17 +44,21 @@ Foam::lumpedPointState::formatNames
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
||||
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
|
||||
|
||||
//! \cond fileScope
|
||||
static Foam::string getLineNoComment(Foam::ISstream& is)
|
||||
static Foam::string getLineNoComment
|
||||
(
|
||||
Foam::ISstream& is,
|
||||
const char comment = '#'
|
||||
)
|
||||
{
|
||||
Foam::string line;
|
||||
do
|
||||
{
|
||||
is.getLine(line);
|
||||
}
|
||||
while ((line.empty() || line[0] == '#') && is.good());
|
||||
while ((line.empty() || line[0] == comment) && is.good());
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
@ -38,15 +38,16 @@ Foam::word Foam::fileFormats::edgeMeshFormatsCore::nativeExt("eMesh");
|
||||
|
||||
Foam::string Foam::fileFormats::edgeMeshFormatsCore::getLineNoComment
|
||||
(
|
||||
IFstream& is
|
||||
ISstream& is,
|
||||
const char comment
|
||||
)
|
||||
{
|
||||
string line;
|
||||
Foam::string line;
|
||||
do
|
||||
{
|
||||
is.getLine(line);
|
||||
}
|
||||
while ((line.empty() || line[0] == '#') && is.good());
|
||||
while ((line.empty() || line[0] == comment) && is.good());
|
||||
|
||||
return line;
|
||||
}
|
||||
@ -183,16 +184,4 @@ bool Foam::fileFormats::edgeMeshFormatsCore::checkSupport
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::edgeMeshFormatsCore::edgeMeshFormatsCore()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::edgeMeshFormatsCore::~edgeMeshFormatsCore()
|
||||
{}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -46,7 +46,7 @@ namespace Foam
|
||||
|
||||
// Forward declaration of classes
|
||||
|
||||
class IFstream;
|
||||
class ISstream;
|
||||
class Time;
|
||||
|
||||
namespace fileFormats
|
||||
@ -63,7 +63,7 @@ protected:
|
||||
// Protected Member Functions
|
||||
|
||||
//- Read non-comment line
|
||||
static string getLineNoComment(IFstream&);
|
||||
static string getLineNoComment(ISstream& is, const char comment='#');
|
||||
|
||||
public:
|
||||
|
||||
@ -103,11 +103,11 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
edgeMeshFormatsCore();
|
||||
edgeMeshFormatsCore() = default;
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~edgeMeshFormatsCore();
|
||||
virtual ~edgeMeshFormatsCore() = default;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -30,10 +30,7 @@ License
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::NASedgeFormat::NASedgeFormat
|
||||
(
|
||||
const fileName& filename
|
||||
)
|
||||
Foam::fileFormats::NASedgeFormat::NASedgeFormat(const fileName& filename)
|
||||
{
|
||||
read(filename);
|
||||
}
|
||||
@ -62,13 +59,13 @@ bool Foam::fileFormats::NASedgeFormat::read
|
||||
|
||||
while (is.good())
|
||||
{
|
||||
string::size_type linei = 0; // parsing position within current line
|
||||
string line;
|
||||
is.getLine(line);
|
||||
|
||||
// Skip empty or comment
|
||||
if (line.empty() || line[0] == '$')
|
||||
{
|
||||
continue;
|
||||
continue; // Skip empty or comment
|
||||
}
|
||||
|
||||
// Check if character 72 is continuation
|
||||
@ -94,39 +91,38 @@ bool Foam::fileFormats::NASedgeFormat::read
|
||||
}
|
||||
|
||||
|
||||
// Read first word
|
||||
IStringStream lineStream(line);
|
||||
word cmd;
|
||||
lineStream >> cmd;
|
||||
// First word (column 0-8)
|
||||
const word cmd(word::validate(nextNasField(line, linei, 8)));
|
||||
|
||||
if (cmd == "CBEAM" || cmd == "CROD")
|
||||
{
|
||||
edge e;
|
||||
// discard elementId (8-16)
|
||||
(void) nextNasField(line, linei, 8); // 8-16
|
||||
// discard groupId (16-24)
|
||||
(void) nextNasField(line, linei, 8); // 16-24
|
||||
|
||||
// label groupId = readLabel(line.substr(16,8));
|
||||
e[0] = readLabel(line.substr(24,8));
|
||||
e[1] = readLabel(line.substr(32,8));
|
||||
label a = readLabel(nextNasField(line, linei, 8)); // 24-32
|
||||
label b = readLabel(nextNasField(line, linei, 8)); // 32-40
|
||||
|
||||
// discard groupID
|
||||
dynEdges.append(e);
|
||||
dynEdges.append(edge(a,b));
|
||||
}
|
||||
else if (cmd == "PLOTEL")
|
||||
{
|
||||
edge e;
|
||||
// discard elementId (8-16)
|
||||
(void) nextNasField(line, linei, 8); // 8-16
|
||||
|
||||
// label groupId = readLabel(line.substr(16,8));
|
||||
e[0] = readLabel(line.substr(16,8));
|
||||
e[1] = readLabel(line.substr(24,8));
|
||||
label a = readLabel(nextNasField(line, linei, 8)); // 16-24
|
||||
label b = readLabel(nextNasField(line, linei, 8)); // 24-32
|
||||
|
||||
// discard groupID
|
||||
dynEdges.append(e);
|
||||
dynEdges.append(edge(a,b));
|
||||
}
|
||||
else if (cmd == "GRID")
|
||||
{
|
||||
label index = readLabel(line.substr(8,8));
|
||||
scalar x = readNasScalar(line.substr(24, 8));
|
||||
scalar y = readNasScalar(line.substr(32, 8));
|
||||
scalar z = readNasScalar(line.substr(40, 8));
|
||||
label index = readLabel(nextNasField(line, linei, 8)); // 8-16
|
||||
(void) nextNasField(line, linei, 8); // 16-24
|
||||
scalar x = readNasScalar(nextNasField(line, linei, 8)); // 24-32
|
||||
scalar y = readNasScalar(nextNasField(line, linei, 8)); // 32-40
|
||||
scalar z = readNasScalar(nextNasField(line, linei, 8)); // 40-48
|
||||
|
||||
pointId.append(index);
|
||||
dynPoints.append(point(x, y, z));
|
||||
@ -139,10 +135,12 @@ bool Foam::fileFormats::NASedgeFormat::read
|
||||
// GRID* 126 0 -5.55999875E+02 -5.68730474E+02
|
||||
// * 2.14897901E+02
|
||||
|
||||
label index = readLabel(line.substr(8,16));
|
||||
scalar x = readNasScalar(line.substr(40, 16));
|
||||
scalar y = readNasScalar(line.substr(56, 16));
|
||||
label index = readLabel(nextNasField(line, linei, 16)); // 8-24
|
||||
(void) nextNasField(line, linei, 16); // 24-40
|
||||
scalar x = readNasScalar(nextNasField(line, linei, 16)); // 40-56
|
||||
scalar y = readNasScalar(nextNasField(line, linei, 16)); // 56-72
|
||||
|
||||
linei = 0; // restart at index 0
|
||||
is.getLine(line);
|
||||
if (line[0] != '*')
|
||||
{
|
||||
@ -153,7 +151,8 @@ bool Foam::fileFormats::NASedgeFormat::read
|
||||
<< "File:" << is.name() << " line:" << is.lineNumber()
|
||||
<< exit(FatalError);
|
||||
}
|
||||
scalar z = readNasScalar(line.substr(8, 16));
|
||||
(void) nextNasField(line, linei, 8); // 0-8
|
||||
scalar z = readNasScalar(nextNasField(line, linei, 16)); // 8-16
|
||||
|
||||
pointId.append(index);
|
||||
dynPoints.append(point(x, y, z));
|
||||
@ -179,9 +178,8 @@ bool Foam::fileFormats::NASedgeFormat::read
|
||||
|
||||
// Pass1: relabel edges
|
||||
// ~~~~~~~~~~~~~~~~~~~~
|
||||
forAll(dynEdges, i)
|
||||
for (edge& e : dynEdges)
|
||||
{
|
||||
edge& e = dynEdges[i];
|
||||
e[0] = mapPointId[e[0]];
|
||||
e[1] = mapPointId[e[1]];
|
||||
|
||||
@ -191,7 +189,7 @@ bool Foam::fileFormats::NASedgeFormat::read
|
||||
pointId.clearStorage();
|
||||
mapPointId.clear();
|
||||
|
||||
// not all the points were used, cull them accordingly
|
||||
// Not all the points were used, cull them accordingly
|
||||
if (unsigned(points().size()) != usedPoints.count())
|
||||
{
|
||||
label nUsed = 0;
|
||||
@ -215,11 +213,9 @@ bool Foam::fileFormats::NASedgeFormat::read
|
||||
|
||||
pts.setSize(nUsed);
|
||||
|
||||
// renumber edge vertices
|
||||
forAll(dynEdges, edgeI)
|
||||
// Renumber edge vertices
|
||||
for (edge& e : dynEdges)
|
||||
{
|
||||
edge& e = dynEdges[edgeI];
|
||||
|
||||
e[0] = mapPointId[e[0]];
|
||||
e[1] = mapPointId[e[1]];
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -27,6 +27,13 @@ Class
|
||||
Description
|
||||
Nastran edge reader.
|
||||
|
||||
- Interprets "CBEAM", "CROD" and "PLOTEL" entries as edges.
|
||||
- Handles Nastran short, long formats and comma-separated free format.
|
||||
- Properly handles the Nastran compact floating point notation: \n
|
||||
\verbatim
|
||||
GRID 28 10.20269-.030265-2.358-8
|
||||
\endverbatim
|
||||
|
||||
SourceFiles
|
||||
NASedgeFormat.C
|
||||
|
||||
@ -57,17 +64,17 @@ class NASedgeFormat
|
||||
// Private Member Functions
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
NASedgeFormat(const NASedgeFormat&);
|
||||
NASedgeFormat(const NASedgeFormat&) = delete;
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const NASedgeFormat&);
|
||||
void operator=(const NASedgeFormat&) = delete;
|
||||
|
||||
public:
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from file name
|
||||
NASedgeFormat(const fileName&);
|
||||
NASedgeFormat(const fileName& filename);
|
||||
|
||||
|
||||
// Selectors
|
||||
@ -83,14 +90,14 @@ public:
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~NASedgeFormat()
|
||||
{}
|
||||
virtual ~NASedgeFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Read from a file
|
||||
virtual bool read(const fileName&);
|
||||
virtual bool read(const fileName& filename);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -40,164 +40,84 @@ namespace Foam
|
||||
defineSurfaceWriterWriteFields(nastranSurfaceWriter);
|
||||
}
|
||||
|
||||
|
||||
const Foam::Enum
|
||||
<
|
||||
Foam::nastranSurfaceWriter::writeFormat
|
||||
Foam::nastranSurfaceWriter::loadFormat
|
||||
>
|
||||
Foam::nastranSurfaceWriter::writeFormatNames_
|
||||
Foam::nastranSurfaceWriter::loadFormatNames_
|
||||
{
|
||||
{ writeFormat::wfShort, "short" },
|
||||
{ writeFormat::wfLong, "long" },
|
||||
{ writeFormat::wfFree, "free" },
|
||||
};
|
||||
|
||||
|
||||
const Foam::Enum
|
||||
<
|
||||
Foam::nastranSurfaceWriter::dataFormat
|
||||
>
|
||||
Foam::nastranSurfaceWriter::dataFormatNames_
|
||||
{
|
||||
{ dataFormat::dfPLOAD2, "PLOAD2" },
|
||||
{ dataFormat::dfPLOAD4, "PLOAD4" },
|
||||
{ loadFormat::PLOAD2, "PLOAD2" },
|
||||
{ loadFormat::PLOAD4, "PLOAD4" },
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
void Foam::nastranSurfaceWriter::formatOS(Ostream& os) const
|
||||
{
|
||||
os.setf(ios_base::scientific);
|
||||
|
||||
// Capitalise the E marker
|
||||
os.setf(ios_base::uppercase);
|
||||
|
||||
label prec = 0;
|
||||
label offset = 7;
|
||||
switch (writeFormat_)
|
||||
{
|
||||
case wfShort:
|
||||
{
|
||||
prec = 8 - offset;
|
||||
break;
|
||||
}
|
||||
|
||||
case wfFree:
|
||||
case wfLong:
|
||||
{
|
||||
prec = 16 - offset;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Unknown writeFormat enumeration" << abort(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
os.precision(prec);
|
||||
}
|
||||
|
||||
|
||||
Foam::Ostream& Foam::nastranSurfaceWriter::writeKeyword
|
||||
(
|
||||
Ostream& os,
|
||||
const word& keyword
|
||||
) const
|
||||
{
|
||||
os.setf(ios_base::left);
|
||||
|
||||
switch (writeFormat_)
|
||||
{
|
||||
case wfShort:
|
||||
{
|
||||
os << setw(8) << keyword;
|
||||
break;
|
||||
}
|
||||
|
||||
case wfLong:
|
||||
{
|
||||
os << setw(8) << word(keyword + '*');
|
||||
break;
|
||||
}
|
||||
|
||||
case wfFree:
|
||||
{
|
||||
os << keyword;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
os.unsetf(ios_base::left);
|
||||
|
||||
return os;
|
||||
return fileFormats::NASCore::writeKeyword(os, keyword, writeFormat_);
|
||||
}
|
||||
|
||||
|
||||
void Foam::nastranSurfaceWriter::writeCoord
|
||||
(
|
||||
Ostream& os,
|
||||
const point& p,
|
||||
const point& pt,
|
||||
const label pointI
|
||||
) const
|
||||
{
|
||||
// Fixed short/long formats:
|
||||
// 1 GRID
|
||||
// 2 ID : point ID - requires starting index of 1
|
||||
// 3 CP : co-ordinate system ID (blank)
|
||||
// 4 X1 : point x cp-ordinate
|
||||
// 5 X2 : point x cp-ordinate
|
||||
// 6 X3 : point x cp-ordinate
|
||||
// 7 CD : co-ordinate system for displacements (blank)
|
||||
// 8 PS : single point constraints (blank)
|
||||
// 3 CP : coordinate system ID (blank)
|
||||
// 4 X1 : point x coordinate
|
||||
// 5 X2 : point x coordinate
|
||||
// 6 X3 : point x coordinate
|
||||
// 7 CD : coordinate system for displacements (blank)
|
||||
// 8 PS : single point constraints (blank)
|
||||
// 9 SEID : super-element ID
|
||||
|
||||
writeKeyword(os, "GRID") << separator_;
|
||||
|
||||
os.setf(ios_base::right);
|
||||
os.setf(std::ios_base::right);
|
||||
|
||||
writeValue(os, pointI+1) << separator_;
|
||||
writeValue(os, "") << separator_;
|
||||
writeValue(os, p.x()) << separator_;
|
||||
writeValue(os, p.y()) << separator_;
|
||||
writeValue(os, pt.x()) << separator_;
|
||||
writeValue(os, pt.y()) << separator_;
|
||||
|
||||
switch (writeFormat_)
|
||||
{
|
||||
case wfShort:
|
||||
case fieldFormat::SHORT :
|
||||
{
|
||||
os << setw(8) << p.z()
|
||||
<< nl;
|
||||
os.unsetf(ios_base::right);
|
||||
os << setw(8) << pt.z() << nl;
|
||||
os.unsetf(std::ios_base::right);
|
||||
break;
|
||||
}
|
||||
|
||||
case wfLong:
|
||||
case fieldFormat::LONG :
|
||||
{
|
||||
os << nl;
|
||||
os.unsetf(ios_base::right);
|
||||
os.unsetf(std::ios_base::right);
|
||||
writeKeyword(os, "");
|
||||
os.setf(ios_base::right);
|
||||
os.setf(std::ios_base::right);
|
||||
|
||||
writeValue(os, p.z()) << nl;
|
||||
writeValue(os, pt.z()) << nl;
|
||||
break;
|
||||
}
|
||||
|
||||
case wfFree:
|
||||
case fieldFormat::FREE :
|
||||
{
|
||||
writeValue(os, p.z()) << nl;
|
||||
writeValue(os, pt.z()) << nl;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Unknown writeFormat enumeration" << abort(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
os.unsetf(ios_base::right);
|
||||
os.unsetf(std::ios_base::right);
|
||||
}
|
||||
|
||||
|
||||
@ -226,23 +146,24 @@ void Foam::nastranSurfaceWriter::writeFace
|
||||
|
||||
writeKeyword(os, faceType) << separator_;
|
||||
|
||||
os.setf(ios_base::right);
|
||||
os.setf(std::ios_base::right);
|
||||
|
||||
writeValue(os, nFace) << separator_;
|
||||
writeValue(os, PID);
|
||||
|
||||
switch (writeFormat_)
|
||||
{
|
||||
case wfShort:
|
||||
case fieldFormat::SHORT :
|
||||
{
|
||||
forAll(facePts, i)
|
||||
for (const label pointi : facePts)
|
||||
{
|
||||
writeValue(os, facePts[i] + 1);
|
||||
writeValue(os, pointi + 1);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case wfLong:
|
||||
|
||||
case fieldFormat::LONG :
|
||||
{
|
||||
forAll(facePts, i)
|
||||
{
|
||||
@ -250,33 +171,29 @@ void Foam::nastranSurfaceWriter::writeFace
|
||||
if (i == 1)
|
||||
{
|
||||
os << nl;
|
||||
os.unsetf(ios_base::right);
|
||||
os.unsetf(std::ios_base::right);
|
||||
writeKeyword(os, "");
|
||||
os.setf(ios_base::right);
|
||||
os.setf(std::ios_base::right);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case wfFree:
|
||||
|
||||
case fieldFormat::FREE :
|
||||
{
|
||||
forAll(facePts, i)
|
||||
for (const label pointi : facePts)
|
||||
{
|
||||
os << separator_;
|
||||
writeValue(os, facePts[i] + 1);
|
||||
writeValue(os, pointi + 1);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Unknown writeFormat enumeration" << abort(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
os << nl;
|
||||
os.unsetf(ios_base::right);
|
||||
os.unsetf(std::ios_base::right);
|
||||
}
|
||||
|
||||
|
||||
@ -375,7 +292,7 @@ Foam::Ostream& Foam::nastranSurfaceWriter::writeFooter
|
||||
|
||||
// use single material ID
|
||||
|
||||
label MID = 1;
|
||||
const label MID = 1;
|
||||
|
||||
writeKeyword(os, "MAT1") << separator_;
|
||||
writeValue(os, MID);
|
||||
@ -397,49 +314,48 @@ Foam::Ostream& Foam::nastranSurfaceWriter::writeFooter
|
||||
Foam::nastranSurfaceWriter::nastranSurfaceWriter()
|
||||
:
|
||||
surfaceWriter(),
|
||||
writeFormat_(wfShort),
|
||||
writeFormat_(fieldFormat::SHORT),
|
||||
fieldMap_(),
|
||||
scale_(1.0)
|
||||
scale_(1.0),
|
||||
separator_()
|
||||
{}
|
||||
|
||||
|
||||
Foam::nastranSurfaceWriter::nastranSurfaceWriter(const dictionary& options)
|
||||
:
|
||||
surfaceWriter(),
|
||||
writeFormat_(writeFormat::wfLong),
|
||||
fieldMap_(),
|
||||
scale_(options.lookupOrDefault("scale", 1.0)),
|
||||
separator_("")
|
||||
{
|
||||
writeFormat_ = writeFormatNames_.lookupOrDefault
|
||||
writeFormat_
|
||||
(
|
||||
"format",
|
||||
options,
|
||||
writeFormat::wfLong
|
||||
);
|
||||
|
||||
if (writeFormat_ == wfFree)
|
||||
fileFormats::NASCore::fieldFormatNames.lookupOrDefault
|
||||
(
|
||||
"format",
|
||||
options,
|
||||
fieldFormat::LONG
|
||||
)
|
||||
),
|
||||
fieldMap_(),
|
||||
scale_(options.lookupOrDefault<scalar>("scale", 1.0)),
|
||||
separator_()
|
||||
{
|
||||
if (writeFormat_ == fieldFormat::FREE)
|
||||
{
|
||||
separator_ = ",";
|
||||
}
|
||||
|
||||
List<Pair<word>> fieldSet(options.lookup("fields"));
|
||||
List<Pair<word>> fieldPairs(options.lookup("fields"));
|
||||
|
||||
forAll(fieldSet, i)
|
||||
for (const Pair<word>& item : fieldPairs)
|
||||
{
|
||||
dataFormat format = dataFormatNames_[fieldSet[i].second()];
|
||||
|
||||
fieldMap_.insert(fieldSet[i].first(), format);
|
||||
// (field name => load format)
|
||||
fieldMap_.insert
|
||||
(
|
||||
item.first(),
|
||||
loadFormatNames_[item.second()]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::nastranSurfaceWriter::~nastranSurfaceWriter()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileName Foam::nastranSurfaceWriter::write
|
||||
@ -456,7 +372,7 @@ Foam::fileName Foam::nastranSurfaceWriter::write
|
||||
}
|
||||
|
||||
OFstream os(outputDir/surfaceName + ".nas");
|
||||
formatOS(os);
|
||||
fileFormats::NASCore::setPrecision(os, writeFormat_);
|
||||
|
||||
if (verbose)
|
||||
{
|
||||
@ -472,7 +388,7 @@ Foam::fileName Foam::nastranSurfaceWriter::write
|
||||
writeGeometry(os, surf, decomposedFaces);
|
||||
|
||||
writeFooter(os, surf)
|
||||
<< "ENDDATA" << endl;
|
||||
<< "ENDDATA" << nl;
|
||||
|
||||
return os.name();
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2015-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -32,16 +32,16 @@ Description
|
||||
{
|
||||
nastran
|
||||
{
|
||||
// From OpenFOAM field name to Nastran field name
|
||||
// From OpenFOAM field name to NASTRAN field name
|
||||
fields
|
||||
(
|
||||
(pMean PLOAD2)
|
||||
(p PLOAD4)
|
||||
(pMean PLOAD2)
|
||||
(p PLOAD4)
|
||||
);
|
||||
// Optional scale
|
||||
scale 2.0;
|
||||
scale 2.0;
|
||||
// Optional format
|
||||
format free; //short, long, free
|
||||
format free; // short, long, free
|
||||
}
|
||||
};
|
||||
\endverbatim
|
||||
@ -56,7 +56,7 @@ SourceFiles
|
||||
#define nastranSurfaceWriter_H
|
||||
|
||||
#include "surfaceWriter.H"
|
||||
#include "Enum.H"
|
||||
#include "NASCore.H"
|
||||
#include "OFstream.H"
|
||||
#include "HashTable.H"
|
||||
|
||||
@ -75,17 +75,14 @@ class nastranSurfaceWriter
|
||||
{
|
||||
public:
|
||||
|
||||
enum writeFormat
|
||||
{
|
||||
wfShort,
|
||||
wfLong,
|
||||
wfFree
|
||||
};
|
||||
//- File field formats
|
||||
using fieldFormat = Foam::fileFormats::NASCore::fieldFormat;
|
||||
|
||||
enum dataFormat
|
||||
//- Output load format
|
||||
enum loadFormat
|
||||
{
|
||||
dfPLOAD2,
|
||||
dfPLOAD4
|
||||
PLOAD2,
|
||||
PLOAD4
|
||||
};
|
||||
|
||||
|
||||
@ -93,14 +90,13 @@ private:
|
||||
|
||||
// Private data
|
||||
|
||||
static const Enum<writeFormat> writeFormatNames_;
|
||||
static const Enum<dataFormat> dataFormatNames_;
|
||||
static const Enum<loadFormat> loadFormatNames_;
|
||||
|
||||
//- Write option
|
||||
writeFormat writeFormat_;
|
||||
//- Field format (width and separator)
|
||||
fieldFormat writeFormat_;
|
||||
|
||||
//- Mapping from field name to data format enumeration
|
||||
HashTable<dataFormat> fieldMap_;
|
||||
HashTable<loadFormat> fieldMap_;
|
||||
|
||||
//- Scale to apply to values (default = 1.0)
|
||||
scalar scale_;
|
||||
@ -111,14 +107,11 @@ private:
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Initialise the output stream format parameters
|
||||
void formatOS(Ostream& os) const;
|
||||
|
||||
//- Write a coordinate
|
||||
void writeCoord
|
||||
(
|
||||
Ostream& os,
|
||||
const point& p,
|
||||
const point& pt,
|
||||
const label pointI //!< 0-based Point Id
|
||||
) const;
|
||||
|
||||
@ -159,7 +152,7 @@ private:
|
||||
Ostream& writeFaceValue
|
||||
(
|
||||
Ostream& os,
|
||||
const dataFormat& format,
|
||||
const loadFormat format,
|
||||
const Type& value,
|
||||
const label EID //!< 1-based Element Id
|
||||
) const;
|
||||
@ -195,7 +188,7 @@ public:
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~nastranSurfaceWriter();
|
||||
virtual ~nastranSurfaceWriter() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2015-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -38,17 +38,19 @@ Foam::Ostream& Foam::nastranSurfaceWriter::writeValue
|
||||
{
|
||||
switch (writeFormat_)
|
||||
{
|
||||
case wfShort:
|
||||
case fieldFormat::SHORT :
|
||||
{
|
||||
os << setw(8) << value;
|
||||
break;
|
||||
}
|
||||
case wfLong:
|
||||
|
||||
case fieldFormat::LONG :
|
||||
{
|
||||
os << setw(16) << value;
|
||||
break;
|
||||
}
|
||||
case wfFree:
|
||||
|
||||
case fieldFormat::FREE :
|
||||
{
|
||||
os << value;
|
||||
break;
|
||||
@ -63,7 +65,7 @@ template<class Type>
|
||||
Foam::Ostream& Foam::nastranSurfaceWriter::writeFaceValue
|
||||
(
|
||||
Ostream& os,
|
||||
const dataFormat& format,
|
||||
const loadFormat format,
|
||||
const Type& value,
|
||||
const label EID
|
||||
) const
|
||||
@ -87,16 +89,16 @@ Foam::Ostream& Foam::nastranSurfaceWriter::writeFaceValue
|
||||
Type scaledValue = scale_*value;
|
||||
|
||||
// Write keyword
|
||||
writeKeyword(os, dataFormatNames_[format]) << separator_;
|
||||
writeKeyword(os, loadFormatNames_[format]) << separator_;
|
||||
|
||||
// Write load set ID
|
||||
os.setf(ios_base::right);
|
||||
os.setf(std::ios_base::right);
|
||||
|
||||
writeValue(os, SID) << separator_;
|
||||
|
||||
switch (format)
|
||||
{
|
||||
case dfPLOAD2:
|
||||
case loadFormat::PLOAD2 :
|
||||
{
|
||||
if (pTraits<Type>::nComponents == 1)
|
||||
{
|
||||
@ -105,7 +107,7 @@ Foam::Ostream& Foam::nastranSurfaceWriter::writeFaceValue
|
||||
else
|
||||
{
|
||||
WarningInFunction
|
||||
<< dataFormatNames_[format] << " requires scalar values "
|
||||
<< loadFormatNames_[format] << " requires scalar values "
|
||||
<< "and cannot be used for higher rank values"
|
||||
<< endl;
|
||||
|
||||
@ -116,27 +118,20 @@ Foam::Ostream& Foam::nastranSurfaceWriter::writeFaceValue
|
||||
break;
|
||||
}
|
||||
|
||||
case dfPLOAD4:
|
||||
case loadFormat::PLOAD4 :
|
||||
{
|
||||
writeValue(os, EID);
|
||||
|
||||
for (direction dirI = 0; dirI < pTraits<Type>::nComponents; ++dirI)
|
||||
for (direction d = 0; d < pTraits<Type>::nComponents; ++d)
|
||||
{
|
||||
os << separator_;
|
||||
writeValue(os, component(scaledValue, dirI));
|
||||
writeValue(os, component(scaledValue, d));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Unhandled enumeration " << dataFormatNames_[format]
|
||||
<< exit(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
os.unsetf(ios_base::right);
|
||||
os.unsetf(std::ios_base::right);
|
||||
|
||||
os << nl;
|
||||
|
||||
@ -167,7 +162,7 @@ Foam::fileName Foam::nastranSurfaceWriter::writeTemplate
|
||||
return fileName::null;
|
||||
}
|
||||
|
||||
const dataFormat& format(fieldMap_[fieldName]);
|
||||
const loadFormat& format(fieldMap_[fieldName]);
|
||||
|
||||
if (!isDir(outputDir/fieldName))
|
||||
{
|
||||
@ -178,7 +173,7 @@ Foam::fileName Foam::nastranSurfaceWriter::writeTemplate
|
||||
const scalar timeValue = 0.0;
|
||||
|
||||
OFstream os(outputDir/fieldName/surfaceName + ".nas");
|
||||
formatOS(os);
|
||||
fileFormats::NASCore::setPrecision(os, writeFormat_);
|
||||
|
||||
if (verbose)
|
||||
{
|
||||
@ -199,21 +194,19 @@ Foam::fileName Foam::nastranSurfaceWriter::writeTemplate
|
||||
<< "$ Field data" << nl
|
||||
<< "$" << nl;
|
||||
|
||||
label elemId = 0;
|
||||
|
||||
if (isNodeValues)
|
||||
{
|
||||
label elemId = 0;
|
||||
|
||||
forAll(decomposedFaces, i)
|
||||
for (const DynamicList<face>& dFaces : decomposedFaces)
|
||||
{
|
||||
const DynamicList<face>& dFaces = decomposedFaces[i];
|
||||
forAll(dFaces, facei)
|
||||
for (const face& f : dFaces)
|
||||
{
|
||||
Type v = Zero;
|
||||
const face& f = dFaces[facei];
|
||||
|
||||
forAll(f, fptI)
|
||||
for (const label verti : f)
|
||||
{
|
||||
v += values[f[fptI]];
|
||||
v += values[verti];
|
||||
}
|
||||
v /= f.size();
|
||||
|
||||
@ -223,11 +216,8 @@ Foam::fileName Foam::nastranSurfaceWriter::writeTemplate
|
||||
}
|
||||
else
|
||||
{
|
||||
label elemId = 0;
|
||||
|
||||
forAll(decomposedFaces, i)
|
||||
for (const DynamicList<face>& dFaces : decomposedFaces)
|
||||
{
|
||||
const DynamicList<face>& dFaces = decomposedFaces[i];
|
||||
forAll(dFaces, facei)
|
||||
{
|
||||
writeFaceValue(os, format, values[facei], ++elemId);
|
||||
|
||||
@ -55,9 +55,8 @@ void Foam::vtkSurfaceWriter::writeGeometry
|
||||
|
||||
// Write vertex coords
|
||||
os << "POINTS " << points.size() << " double" << nl;
|
||||
forAll(points, pointi)
|
||||
for (const point& pt : points)
|
||||
{
|
||||
const point& pt = points[pointi];
|
||||
os << float(pt.x()) << ' '
|
||||
<< float(pt.y()) << ' '
|
||||
<< float(pt.z()) << nl;
|
||||
@ -67,22 +66,20 @@ void Foam::vtkSurfaceWriter::writeGeometry
|
||||
|
||||
// Write faces
|
||||
label nNodes = 0;
|
||||
forAll(faces, facei)
|
||||
for (const face& f : faces)
|
||||
{
|
||||
nNodes += faces[facei].size();
|
||||
nNodes += f.size();
|
||||
}
|
||||
|
||||
os << "POLYGONS " << faces.size() << ' '
|
||||
<< faces.size() + nNodes << nl;
|
||||
|
||||
forAll(faces, facei)
|
||||
for (const face& f : faces)
|
||||
{
|
||||
const face& f = faces[facei];
|
||||
|
||||
os << f.size();
|
||||
forAll(f, fp)
|
||||
for (const label verti : f)
|
||||
{
|
||||
os << ' ' << f[fp];
|
||||
os << ' ' << verti;
|
||||
}
|
||||
os << nl;
|
||||
}
|
||||
@ -130,9 +127,8 @@ namespace Foam
|
||||
{
|
||||
os << "3 " << values.size() << " float" << nl;
|
||||
|
||||
forAll(values, elemI)
|
||||
for (const vector& v : values)
|
||||
{
|
||||
const vector& v = values[elemI];
|
||||
os << float(v[0]) << ' '
|
||||
<< float(v[1]) << ' '
|
||||
<< float(v[2]) << nl;
|
||||
@ -149,9 +145,8 @@ namespace Foam
|
||||
{
|
||||
os << "1 " << values.size() << " float" << nl;
|
||||
|
||||
forAll(values, elemI)
|
||||
for (const sphericalTensor& v : values)
|
||||
{
|
||||
const sphericalTensor& v = values[elemI];
|
||||
os << float(v[0]) << nl;
|
||||
}
|
||||
}
|
||||
@ -166,9 +161,8 @@ namespace Foam
|
||||
{
|
||||
os << "6 " << values.size() << " float" << nl;
|
||||
|
||||
forAll(values, elemI)
|
||||
for (const symmTensor& v : values)
|
||||
{
|
||||
const symmTensor& v = values[elemI];
|
||||
os << float(v[0]) << ' ' << float(v[1]) << ' ' << float(v[2])
|
||||
<< ' '
|
||||
<< float(v[3]) << ' ' << float(v[4]) << ' ' << float(v[5])
|
||||
@ -187,9 +181,8 @@ namespace Foam
|
||||
{
|
||||
os << "9 " << values.size() << " float" << nl;
|
||||
|
||||
forAll(values, elemI)
|
||||
for (const tensor& v : values)
|
||||
{
|
||||
const tensor& v = values[elemI];
|
||||
os << float(v[0]) << ' ' << float(v[1]) << ' ' << float(v[2])
|
||||
<< ' '
|
||||
<< float(v[3]) << ' ' << float(v[4]) << ' ' << float(v[5])
|
||||
@ -211,12 +204,12 @@ Foam::vtkSurfaceWriter::vtkSurfaceWriter()
|
||||
{}
|
||||
|
||||
|
||||
Foam::vtkSurfaceWriter::vtkSurfaceWriter(const dictionary& dict)
|
||||
Foam::vtkSurfaceWriter::vtkSurfaceWriter(const dictionary& options)
|
||||
:
|
||||
surfaceWriter(),
|
||||
writePrecision_
|
||||
(
|
||||
dict.lookupOrDefault
|
||||
options.lookupOrDefault
|
||||
(
|
||||
"writePrecision",
|
||||
IOstream::defaultPrecision()
|
||||
@ -225,12 +218,6 @@ Foam::vtkSurfaceWriter::vtkSurfaceWriter(const dictionary& dict)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::vtkSurfaceWriter::~vtkSurfaceWriter()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileName Foam::vtkSurfaceWriter::write
|
||||
@ -260,7 +247,7 @@ Foam::fileName Foam::vtkSurfaceWriter::write
|
||||
}
|
||||
|
||||
|
||||
// create write methods
|
||||
// Create write methods
|
||||
defineSurfaceWriterWriteFields(Foam::vtkSurfaceWriter);
|
||||
|
||||
|
||||
|
||||
@ -93,7 +93,7 @@ public:
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~vtkSurfaceWriter();
|
||||
virtual ~vtkSurfaceWriter() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
@ -25,6 +25,7 @@ $(surfaceFormats)/ac3d/AC3DsurfaceFormatCore.C
|
||||
$(surfaceFormats)/ac3d/AC3DsurfaceFormatRunTime.C
|
||||
$(surfaceFormats)/fire/FLMAsurfaceFormatRunTime.C
|
||||
$(surfaceFormats)/gts/GTSsurfaceFormatRunTime.C
|
||||
$(surfaceFormats)/gts/triSurfaceGTSformat.C
|
||||
$(surfaceFormats)/nas/NASsurfaceFormatRunTime.C
|
||||
$(surfaceFormats)/obj/OBJsurfaceFormatRunTime.C
|
||||
$(surfaceFormats)/obj/OBJstream.C
|
||||
@ -33,7 +34,8 @@ $(surfaceFormats)/smesh/SMESHsurfaceFormatRunTime.C
|
||||
$(surfaceFormats)/starcd/STARCDsurfaceFormatCore.C
|
||||
$(surfaceFormats)/starcd/STARCDsurfaceFormatRunTime.C
|
||||
$(surfaceFormats)/stl/STLsurfaceFormatRunTime.C
|
||||
$(surfaceFormats)/tri/TRIsurfaceFormatCore.C
|
||||
$(surfaceFormats)/stl/triSurfaceSTLformat.C
|
||||
$(surfaceFormats)/tri/TRIReader.C
|
||||
$(surfaceFormats)/tri/TRIsurfaceFormatRunTime.C
|
||||
$(surfaceFormats)/vtk/VTKsurfaceFormatCore.C
|
||||
$(surfaceFormats)/vtk/VTKsurfaceFormatRunTime.C
|
||||
@ -43,29 +45,12 @@ $(surfaceFormats)/x3d/X3DsurfaceFormatCore.C
|
||||
$(surfaceFormats)/x3d/X3DsurfaceFormatRunTime.C
|
||||
|
||||
triSurface/triSurface.C
|
||||
triSurface/triSurfaceIO.C
|
||||
triSurface/triSurfaceAddressing.C
|
||||
triSurface/stitchTriangles.C
|
||||
triSurface/triSurfaceStitch.C
|
||||
|
||||
triSurface/fields/triSurfaceFields.C
|
||||
triSurface/patches/geometricSurfacePatch.C
|
||||
triSurface/patches/surfacePatch.C
|
||||
|
||||
interfaces = triSurface/interfaces
|
||||
$(interfaces)/STL/writeSTL.C
|
||||
$(interfaces)/STL/readSTL.C
|
||||
$(interfaces)/GTS/writeGTS.C
|
||||
$(interfaces)/GTS/readGTS.C
|
||||
$(interfaces)/OBJ/readOBJ.C
|
||||
$(interfaces)/OBJ/writeOBJ.C
|
||||
$(interfaces)/SMESH/writeSMESH.C
|
||||
$(interfaces)/OFF/readOFF.C
|
||||
$(interfaces)/OFF/writeOFF.C
|
||||
$(interfaces)/TRI/writeTRI.C
|
||||
$(interfaces)/TRI/readTRI.C
|
||||
$(interfaces)/AC3D/readAC.C
|
||||
$(interfaces)/AC3D/writeAC.C
|
||||
$(interfaces)/VTK/readVTK.C
|
||||
$(interfaces)/VTK/writeVTK.C
|
||||
$(interfaces)/NAS/readNAS.C
|
||||
|
||||
LIB = $(FOAM_LIBBIN)/libsurfMesh
|
||||
|
||||
@ -107,10 +107,11 @@ template<class Face>
|
||||
void Foam::MeshedSurface<Face>::write
|
||||
(
|
||||
const fileName& name,
|
||||
const MeshedSurface<Face>& surf
|
||||
const MeshedSurface<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
write(name, name.ext(), surf);
|
||||
write(name, name.ext(), surf, options);
|
||||
}
|
||||
|
||||
|
||||
@ -119,7 +120,8 @@ void Foam::MeshedSurface<Face>::write
|
||||
(
|
||||
const fileName& name,
|
||||
const word& ext,
|
||||
const MeshedSurface<Face>& surf
|
||||
const MeshedSurface<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
if (debug)
|
||||
@ -136,7 +138,7 @@ void Foam::MeshedSurface<Face>::write
|
||||
|
||||
if (delegate.found(ext))
|
||||
{
|
||||
MeshedSurfaceProxy<Face>(surf).write(name, ext);
|
||||
MeshedSurfaceProxy<Face>(surf).write(name, ext, options);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -149,7 +151,7 @@ void Foam::MeshedSurface<Face>::write
|
||||
}
|
||||
else
|
||||
{
|
||||
mfIter()(name, surf);
|
||||
mfIter()(name, surf, options);
|
||||
}
|
||||
}
|
||||
|
||||
@ -159,7 +161,8 @@ void Foam::MeshedSurface<Face>::write
|
||||
template<class Face>
|
||||
Foam::MeshedSurface<Face>::MeshedSurface()
|
||||
:
|
||||
ParentType(List<Face>(), pointField())
|
||||
ParentType(List<Face>(), pointField()),
|
||||
zones_()
|
||||
{}
|
||||
|
||||
|
||||
@ -171,8 +174,7 @@ Foam::MeshedSurface<Face>::MeshedSurface
|
||||
const Xfer<surfZoneList>& zoneLst
|
||||
)
|
||||
:
|
||||
ParentType(List<Face>(), pointField()),
|
||||
zones_()
|
||||
MeshedSurface<Face>()
|
||||
{
|
||||
reset(pointLst, faceLst, zoneLst);
|
||||
}
|
||||
@ -187,7 +189,7 @@ Foam::MeshedSurface<Face>::MeshedSurface
|
||||
const UList<word>& zoneNames
|
||||
)
|
||||
:
|
||||
ParentType(List<Face>(), pointField())
|
||||
MeshedSurface<Face>()
|
||||
{
|
||||
reset(pointLst, faceLst, Xfer<surfZoneList>());
|
||||
|
||||
@ -242,7 +244,7 @@ Foam::MeshedSurface<Face>::MeshedSurface
|
||||
template<class Face>
|
||||
Foam::MeshedSurface<Face>::MeshedSurface(const surfMesh& mesh)
|
||||
:
|
||||
ParentType(List<Face>(), pointField())
|
||||
MeshedSurface<Face>()
|
||||
{
|
||||
// same face type as surfMesh
|
||||
MeshedSurface<face> surf
|
||||
@ -263,7 +265,7 @@ Foam::MeshedSurface<Face>::MeshedSurface
|
||||
const bool useGlobalPoints
|
||||
)
|
||||
:
|
||||
ParentType(List<Face>(), pointField())
|
||||
MeshedSurface<Face>()
|
||||
{
|
||||
const polyMesh& mesh = bMesh.mesh();
|
||||
const polyPatchList& bPatches = bMesh;
|
||||
@ -312,7 +314,7 @@ Foam::MeshedSurface<Face>::MeshedSurface
|
||||
nZone
|
||||
);
|
||||
|
||||
nZone++;
|
||||
++nZone;
|
||||
startFacei += p.size();
|
||||
}
|
||||
}
|
||||
@ -332,38 +334,27 @@ Foam::MeshedSurface<Face>::MeshedSurface
|
||||
|
||||
|
||||
template<class Face>
|
||||
Foam::MeshedSurface<Face>::MeshedSurface
|
||||
(
|
||||
const fileName& name,
|
||||
const word& ext
|
||||
)
|
||||
Foam::MeshedSurface<Face>::MeshedSurface(const fileName& name, const word& ext)
|
||||
:
|
||||
ParentType(List<Face>(), pointField())
|
||||
MeshedSurface<Face>()
|
||||
{
|
||||
read(name, ext);
|
||||
}
|
||||
|
||||
|
||||
template<class Face>
|
||||
Foam::MeshedSurface<Face>::MeshedSurface
|
||||
(
|
||||
const fileName& name
|
||||
)
|
||||
Foam::MeshedSurface<Face>::MeshedSurface(const fileName& name)
|
||||
:
|
||||
ParentType(List<Face>(), pointField())
|
||||
MeshedSurface<Face>()
|
||||
{
|
||||
read(name);
|
||||
}
|
||||
|
||||
|
||||
template<class Face>
|
||||
Foam::MeshedSurface<Face>::MeshedSurface
|
||||
(
|
||||
Istream& is
|
||||
)
|
||||
Foam::MeshedSurface<Face>::MeshedSurface(Istream& is)
|
||||
:
|
||||
ParentType(List<Face>(), pointField()),
|
||||
zones_()
|
||||
MeshedSurface<Face>()
|
||||
{
|
||||
read(is);
|
||||
}
|
||||
@ -376,7 +367,7 @@ Foam::MeshedSurface<Face>::MeshedSurface
|
||||
const word& surfName
|
||||
)
|
||||
:
|
||||
ParentType(List<Face>(), pointField())
|
||||
MeshedSurface<Face>()
|
||||
{
|
||||
surfMesh mesh
|
||||
(
|
||||
@ -407,10 +398,10 @@ Foam::MeshedSurface<Face>::MeshedSurface
|
||||
template<class Face>
|
||||
Foam::MeshedSurface<Face>::MeshedSurface
|
||||
(
|
||||
const Xfer<UnsortedMeshedSurface<Face>>& surf
|
||||
const Xfer<MeshedSurface<Face>>& surf
|
||||
)
|
||||
:
|
||||
ParentType(List<Face>(), pointField())
|
||||
MeshedSurface<Face>()
|
||||
{
|
||||
transfer(surf());
|
||||
}
|
||||
@ -419,16 +410,15 @@ Foam::MeshedSurface<Face>::MeshedSurface
|
||||
template<class Face>
|
||||
Foam::MeshedSurface<Face>::MeshedSurface
|
||||
(
|
||||
const Xfer<MeshedSurface<Face>>& surf
|
||||
const Xfer<UnsortedMeshedSurface<Face>>& surf
|
||||
)
|
||||
:
|
||||
ParentType(List<Face>(), pointField())
|
||||
MeshedSurface<Face>()
|
||||
{
|
||||
transfer(surf());
|
||||
}
|
||||
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
@ -446,44 +436,43 @@ void Foam::MeshedSurface<Face>::remapFaces
|
||||
const labelUList& faceMap
|
||||
)
|
||||
{
|
||||
// recalculate the zone start/size
|
||||
if (notNull(faceMap) && faceMap.size())
|
||||
if (isNull(faceMap) || faceMap.empty())
|
||||
{
|
||||
surfZoneList& zones = storedZones();
|
||||
return;
|
||||
}
|
||||
|
||||
if (zones.size() == 1)
|
||||
surfZoneList& zones = storedZones();
|
||||
|
||||
if (zones.size() == 1)
|
||||
{
|
||||
zones[0].size() = faceMap.size(); // Single zone case is trivial
|
||||
return;
|
||||
}
|
||||
|
||||
// Recalculate the zone start/size
|
||||
label newFacei = 0;
|
||||
label origEndI = 0;
|
||||
|
||||
for (surfZone& zone : zones)
|
||||
{
|
||||
// Adjust zone start
|
||||
zone.start() = newFacei;
|
||||
origEndI += zone.size();
|
||||
|
||||
for (label facei = newFacei; facei < faceMap.size(); ++facei)
|
||||
{
|
||||
// optimized for single zone case
|
||||
zones[0].size() = faceMap.size();
|
||||
}
|
||||
else if (zones.size())
|
||||
{
|
||||
label newFacei = 0;
|
||||
label origEndI = 0;
|
||||
forAll(zones, zoneI)
|
||||
if (faceMap[facei] < origEndI)
|
||||
{
|
||||
surfZone& zone = zones[zoneI];
|
||||
|
||||
// adjust zone start
|
||||
zone.start() = newFacei;
|
||||
origEndI += zone.size();
|
||||
|
||||
for (label facei = newFacei; facei < faceMap.size(); ++facei)
|
||||
{
|
||||
if (faceMap[facei] < origEndI)
|
||||
{
|
||||
++newFacei;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// adjust zone size
|
||||
zone.size() = newFacei - zone.start();
|
||||
++newFacei;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Adjust zone size
|
||||
zone.size() = newFacei - zone.start();
|
||||
}
|
||||
}
|
||||
|
||||
@ -664,7 +653,7 @@ bool Foam::MeshedSurface<Face>::stitchFaces
|
||||
faceLst[newFacei] = f;
|
||||
}
|
||||
faceMap[newFacei] = facei;
|
||||
newFacei++;
|
||||
++newFacei;
|
||||
}
|
||||
else if (verbose)
|
||||
{
|
||||
@ -730,7 +719,7 @@ bool Foam::MeshedSurface<Face>::checkFaces
|
||||
}
|
||||
|
||||
faceMap[facei] = facei;
|
||||
newFacei++;
|
||||
++newFacei;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -801,7 +790,7 @@ bool Foam::MeshedSurface<Face>::checkFaces
|
||||
if (okay)
|
||||
{
|
||||
faceMap[facei] = facei;
|
||||
newFacei++;
|
||||
++newFacei;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -834,7 +823,7 @@ bool Foam::MeshedSurface<Face>::checkFaces
|
||||
faceLst[newFacei] = faceLst[facei];
|
||||
}
|
||||
faceMap[newFacei] = facei;
|
||||
newFacei++;
|
||||
++newFacei;
|
||||
}
|
||||
}
|
||||
|
||||
@ -990,11 +979,11 @@ Foam::label Foam::MeshedSurface<Face>::triangulate
|
||||
|
||||
for (label fp = 1; fp < f.size() - 1; ++fp)
|
||||
{
|
||||
label fp1 = f.fcIndex(fp);
|
||||
const label fp1 = f.fcIndex(fp);
|
||||
|
||||
newFaces[nTri] = Face{f[0], f[fp], f[fp1]};
|
||||
faceMap[nTri] = facei;
|
||||
nTri++;
|
||||
++nTri;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1018,7 +1007,7 @@ Foam::label Foam::MeshedSurface<Face>::triangulate
|
||||
static_cast<labelUList&>(tmpTri[triI])
|
||||
);
|
||||
faceMap[nTri] = facei;
|
||||
nTri++;
|
||||
++nTri;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1239,20 +1228,17 @@ Foam::MeshedSurface<Face>::xferZones()
|
||||
}
|
||||
|
||||
|
||||
// Read from file, determine format from extension
|
||||
template<class Face>
|
||||
bool Foam::MeshedSurface<Face>::read(const fileName& name)
|
||||
{
|
||||
word ext = name.ext();
|
||||
const word ext(name.ext());
|
||||
if (ext == "gz")
|
||||
{
|
||||
fileName unzipName = name.lessExt();
|
||||
return read(unzipName, unzipName.ext());
|
||||
}
|
||||
else
|
||||
{
|
||||
return read(name, ext);
|
||||
}
|
||||
|
||||
return read(name, ext);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -52,19 +52,18 @@ SourceFiles
|
||||
#include "pointField.H"
|
||||
#include "face.H"
|
||||
#include "labelledTri.H"
|
||||
|
||||
#include "HashSet.H"
|
||||
#include "surfZoneList.H"
|
||||
#include "surfaceFormatsCore.H"
|
||||
#include "runTimeSelectionTables.H"
|
||||
#include "memberFunctionSelectionTables.H"
|
||||
#include "HashSet.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// Forward declaration of friend functions and operators
|
||||
// Forward declarations
|
||||
|
||||
class Time;
|
||||
class surfMesh;
|
||||
@ -124,10 +123,10 @@ private:
|
||||
// Private Member functions
|
||||
|
||||
//- Read/construct from Istream
|
||||
Istream& read(Istream&);
|
||||
Istream& read(Istream& is);
|
||||
|
||||
//- Write to Ostream
|
||||
Ostream& write(Ostream&) const;
|
||||
Ostream& write(Ostream& os) const;
|
||||
|
||||
|
||||
protected:
|
||||
@ -138,7 +137,7 @@ protected:
|
||||
// Eg, transcribe face to triFace, or face -> labelledTri, including
|
||||
// any addZonesToFaces adjustment.
|
||||
// No general form, only specializations.
|
||||
void transcribe(MeshedSurface<face>&);
|
||||
void transcribe(MeshedSurface<face>& surf);
|
||||
|
||||
//- Basic sanity check on zones
|
||||
void checkZones();
|
||||
@ -195,7 +194,10 @@ public:
|
||||
//- Can we write this file format?
|
||||
static bool canWriteType(const word& ext, const bool verbose=false);
|
||||
|
||||
//- Known readable file-types
|
||||
static wordHashSet readTypes();
|
||||
|
||||
//- Known writable file-types
|
||||
static wordHashSet writeTypes();
|
||||
|
||||
|
||||
@ -222,10 +224,10 @@ public:
|
||||
const UList<word>& zoneNames = UList<word>()
|
||||
);
|
||||
|
||||
//- Construct as copy
|
||||
//- Copy construct
|
||||
MeshedSurface(const MeshedSurface& surf);
|
||||
|
||||
//- Construct from a UnsortedMeshedSurface
|
||||
//- Copy construct from an UnsortedMeshedSurface
|
||||
MeshedSurface(const UnsortedMeshedSurface<Face>& surf);
|
||||
|
||||
//- Construct from a boundary mesh with local points/faces
|
||||
@ -238,11 +240,11 @@ public:
|
||||
//- Construct from a surfMesh
|
||||
MeshedSurface(const surfMesh& mesh);
|
||||
|
||||
//- Construct by transferring the contents from a UnsortedMeshedSurface
|
||||
MeshedSurface(const Xfer<UnsortedMeshedSurface<Face>>&);
|
||||
|
||||
//- Construct by transferring the contents from a MeshedSurface
|
||||
MeshedSurface(const Xfer<MeshedSurface<Face>>&);
|
||||
MeshedSurface(const Xfer<MeshedSurface<Face>>& surf);
|
||||
|
||||
//- Construct by transferring the contents from a UnsortedMeshedSurface
|
||||
MeshedSurface(const Xfer<UnsortedMeshedSurface<Face>>& surf);
|
||||
|
||||
//- Construct from file name (uses extension to determine type)
|
||||
MeshedSurface(const fileName& name);
|
||||
@ -285,7 +287,7 @@ public:
|
||||
);
|
||||
|
||||
//- Select constructed from filename (implicit extension)
|
||||
static autoPtr<MeshedSurface> New(const fileName&);
|
||||
static autoPtr<MeshedSurface> New(const fileName& name);
|
||||
|
||||
|
||||
//- Destructor
|
||||
@ -302,16 +304,18 @@ public:
|
||||
fileExtension,
|
||||
(
|
||||
const fileName& name,
|
||||
const MeshedSurface<Face>& surf
|
||||
const MeshedSurface<Face>& surf,
|
||||
const dictionary& options
|
||||
),
|
||||
(name, surf)
|
||||
(name, surf, options)
|
||||
);
|
||||
|
||||
//- Write to file, selecting writer based on its extension
|
||||
static void write
|
||||
(
|
||||
const fileName& name,
|
||||
const MeshedSurface<Face>& surf
|
||||
const MeshedSurface<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
//- Write to file, selecting writer based on the given extension
|
||||
@ -319,7 +323,8 @@ public:
|
||||
(
|
||||
const fileName& name,
|
||||
const word& ext,
|
||||
const MeshedSurface<Face>& surf
|
||||
const MeshedSurface<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
@ -405,15 +410,15 @@ public:
|
||||
|
||||
|
||||
//- 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);
|
||||
virtual void scalePoints(const scalar scaleFactor);
|
||||
|
||||
//- Reset by transferring contents of the argument and annul it
|
||||
virtual void reset
|
||||
(
|
||||
const Xfer<MeshedSurface<Face>>&
|
||||
const Xfer<MeshedSurface<Face>>& surf
|
||||
);
|
||||
|
||||
//- Reset primitive data (points, faces and zones)
|
||||
@ -500,10 +505,10 @@ public:
|
||||
// Read
|
||||
|
||||
//- Read from file. Chooses reader based on explicit extension
|
||||
bool read(const fileName&, const word& ext);
|
||||
bool read(const fileName& name, const word& ext);
|
||||
|
||||
//- Read from file. Chooses reader based on detected extension
|
||||
virtual bool read(const fileName&);
|
||||
virtual bool read(const fileName& name);
|
||||
|
||||
|
||||
// Write
|
||||
@ -511,15 +516,19 @@ public:
|
||||
void writeStats(Ostream& os) const;
|
||||
|
||||
//- Generic write routine. Chooses writer based on extension.
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, *this);
|
||||
write(name, *this, options);
|
||||
}
|
||||
|
||||
//- Write to database
|
||||
void write
|
||||
(
|
||||
const Time&,
|
||||
const Time& t,
|
||||
const word& surfName = word::null
|
||||
) const;
|
||||
|
||||
|
||||
@ -65,19 +65,18 @@ void Foam::MeshedSurface<Face>::writeStats(Ostream& os) const
|
||||
}
|
||||
else
|
||||
{
|
||||
label nTri = 0;
|
||||
label nQuad = 0;
|
||||
forAll(*this, i)
|
||||
label nTri = 0, nQuad = 0;
|
||||
for (const Face& f : *this)
|
||||
{
|
||||
const label n = this->operator[](i).size();
|
||||
const label n = f.size();
|
||||
|
||||
if (n == 3)
|
||||
{
|
||||
nTri++;
|
||||
++nTri;
|
||||
}
|
||||
else if (n == 4)
|
||||
{
|
||||
nQuad++;
|
||||
++nQuad;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -24,6 +24,7 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "MeshedSurface.H"
|
||||
#include "ListOps.H"
|
||||
|
||||
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||
|
||||
@ -74,27 +75,26 @@ void Foam::MeshedSurface<Face>::sortFacesAndStore
|
||||
|
||||
if (sorted)
|
||||
{
|
||||
// already sorted - simply transfer faces
|
||||
// Already sorted - simply transfer faces
|
||||
this->storedFaces().transfer(oldFaces);
|
||||
}
|
||||
else
|
||||
{
|
||||
// unsorted - determine the sorted order:
|
||||
// avoid SortableList since we discard the main list anyhow
|
||||
List<label> faceMap;
|
||||
sortedOrder(zones, faceMap);
|
||||
zones.clear();
|
||||
|
||||
// sorted faces
|
||||
List<Face> newFaces(faceMap.size());
|
||||
forAll(faceMap, facei)
|
||||
{
|
||||
// use transfer to recover memory where possible
|
||||
newFaces[facei].transfer(oldFaces[faceMap[facei]]);
|
||||
}
|
||||
this->storedFaces().transfer(newFaces);
|
||||
return;
|
||||
}
|
||||
|
||||
// Determine the sorted order:
|
||||
// use sortedOrder directly since we discard the intermediate list anyhow
|
||||
List<label> faceMap;
|
||||
sortedOrder(zones, faceMap);
|
||||
zones.clear();
|
||||
|
||||
// Sorted faces
|
||||
List<Face> newFaces(faceMap.size());
|
||||
forAll(faceMap, facei)
|
||||
{
|
||||
// use transfer to recover memory where possible
|
||||
newFaces[facei].transfer(oldFaces[faceMap[facei]]);
|
||||
}
|
||||
this->storedFaces().transfer(newFaces);
|
||||
}
|
||||
|
||||
|
||||
@ -116,7 +116,7 @@ void Foam::MeshedSurface<Face>::addZones
|
||||
if (srfZones[zoneI].size() || !cullEmpty)
|
||||
{
|
||||
zones[nZone] = surfZone(srfZones[zoneI], nZone);
|
||||
nZone++;
|
||||
++nZone;
|
||||
}
|
||||
}
|
||||
zones.setSize(nZone);
|
||||
@ -148,7 +148,7 @@ void Foam::MeshedSurface<Face>::addZones
|
||||
nZone
|
||||
);
|
||||
start += sizes[zoneI];
|
||||
nZone++;
|
||||
++nZone;
|
||||
}
|
||||
}
|
||||
zones.setSize(nZone);
|
||||
@ -179,7 +179,7 @@ void Foam::MeshedSurface<Face>::addZones
|
||||
nZone
|
||||
);
|
||||
start += sizes[zoneI];
|
||||
nZone++;
|
||||
++nZone;
|
||||
}
|
||||
}
|
||||
zones.setSize(nZone);
|
||||
|
||||
@ -58,10 +58,11 @@ template<class Face>
|
||||
void Foam::MeshedSurfaceProxy<Face>::write
|
||||
(
|
||||
const fileName& name,
|
||||
const MeshedSurfaceProxy& surf
|
||||
const MeshedSurfaceProxy& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
write(name, name.ext(), surf);
|
||||
write(name, name.ext(), surf, options);
|
||||
}
|
||||
|
||||
|
||||
@ -70,7 +71,8 @@ void Foam::MeshedSurfaceProxy<Face>::write
|
||||
(
|
||||
const fileName& name,
|
||||
const word& ext,
|
||||
const MeshedSurfaceProxy& surf
|
||||
const MeshedSurfaceProxy& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
if (debug)
|
||||
@ -89,7 +91,7 @@ void Foam::MeshedSurfaceProxy<Face>::write
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
mfIter()(name, surf);
|
||||
mfIter()(name, surf, options);
|
||||
}
|
||||
|
||||
|
||||
@ -180,8 +182,7 @@ void Foam::MeshedSurfaceProxy<Face>::write
|
||||
|
||||
if (this->useFaceMap())
|
||||
{
|
||||
// this is really a bit annoying (and wasteful) but no other way
|
||||
os << reorder(this->faceMap(), this->surfFaces());
|
||||
os << UIndirectList<Face>(this->surfFaces(), this->faceMap());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -226,9 +227,9 @@ template<class Face>
|
||||
Foam::MeshedSurfaceProxy<Face>::MeshedSurfaceProxy
|
||||
(
|
||||
const pointField& pointLst,
|
||||
const List<Face>& faceLst,
|
||||
const List<surfZone>& zoneLst,
|
||||
const List<label>& faceMap
|
||||
const UList<Face>& faceLst,
|
||||
const UList<surfZone>& zoneLst,
|
||||
const labelUList& faceMap
|
||||
)
|
||||
:
|
||||
points_(pointLst),
|
||||
@ -238,13 +239,6 @@ Foam::MeshedSurfaceProxy<Face>::MeshedSurfaceProxy
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
Foam::MeshedSurfaceProxy<Face>::~MeshedSurfaceProxy()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
@ -254,17 +248,14 @@ inline Foam::label Foam::MeshedSurfaceProxy<Face>::nTriangles() const
|
||||
{
|
||||
return this->size();
|
||||
}
|
||||
else
|
||||
{
|
||||
label nTri = 0;
|
||||
const List<Face>& faceLst = this->surfFaces();
|
||||
forAll(faceLst, facei)
|
||||
{
|
||||
nTri += faceLst[facei].nTriangles();
|
||||
}
|
||||
|
||||
return nTri;
|
||||
label nTri = 0;
|
||||
for (const Face& f : this->surfFaces())
|
||||
{
|
||||
nTri += f.nTriangles();
|
||||
}
|
||||
|
||||
return nTri;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -39,12 +39,11 @@ SourceFiles
|
||||
|
||||
#include "pointField.H"
|
||||
#include "labelledTri.H"
|
||||
|
||||
#include "HashSet.H"
|
||||
#include "surfZoneList.H"
|
||||
#include "surfaceFormatsCore.H"
|
||||
#include "runTimeSelectionTables.H"
|
||||
#include "memberFunctionSelectionTables.H"
|
||||
#include "HashSet.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -64,16 +63,15 @@ class MeshedSurfaceProxy
|
||||
:
|
||||
public fileFormats::surfaceFormatsCore
|
||||
{
|
||||
//- Private data
|
||||
// Private Member Data
|
||||
|
||||
const pointField& points_;
|
||||
|
||||
const List<Face>& faces_;
|
||||
const UList<Face>& faces_;
|
||||
|
||||
const List<surfZone>& zones_;
|
||||
|
||||
const List<label>& faceMap_;
|
||||
const UList<surfZone>& zones_;
|
||||
|
||||
const UList<label>& faceMap_;
|
||||
|
||||
public:
|
||||
|
||||
@ -101,14 +99,14 @@ public:
|
||||
MeshedSurfaceProxy
|
||||
(
|
||||
const pointField& pointLst,
|
||||
const List<Face>& faceLst,
|
||||
const List<surfZone>& zoneLst = List<surfZone>(),
|
||||
const List<label>& faceMap = List<label>()
|
||||
const UList<Face>& faceLst,
|
||||
const UList<surfZone>& zoneLst = List<surfZone>(),
|
||||
const labelUList& faceMap = List<label>()
|
||||
);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~MeshedSurfaceProxy();
|
||||
virtual ~MeshedSurfaceProxy() = default;
|
||||
|
||||
|
||||
// Member Function Selectors
|
||||
@ -121,16 +119,18 @@ public:
|
||||
fileExtension,
|
||||
(
|
||||
const fileName& name,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options
|
||||
),
|
||||
(name, surf)
|
||||
(name, surf, options)
|
||||
);
|
||||
|
||||
//- Write to file, selected based on its extension
|
||||
//- Write to file, select based on its extension
|
||||
static void write
|
||||
(
|
||||
const fileName& name,
|
||||
const MeshedSurfaceProxy& surf
|
||||
const MeshedSurfaceProxy& surf,
|
||||
const dictionary& options
|
||||
);
|
||||
|
||||
//- Write to file, selected based on given extension
|
||||
@ -138,7 +138,8 @@ public:
|
||||
(
|
||||
const fileName& name,
|
||||
const word& ext,
|
||||
const MeshedSurfaceProxy& surf
|
||||
const MeshedSurfaceProxy& surf,
|
||||
const dictionary& options
|
||||
);
|
||||
|
||||
|
||||
@ -159,7 +160,7 @@ public:
|
||||
}
|
||||
|
||||
//- Return const access to the faces
|
||||
inline const List<Face>& surfFaces() const
|
||||
inline const UList<Face>& surfFaces() const
|
||||
{
|
||||
return faces_;
|
||||
}
|
||||
@ -167,13 +168,13 @@ public:
|
||||
//- Const access to the surface zones.
|
||||
// If zones are defined, they must be contiguous and cover the
|
||||
// entire surface
|
||||
inline const List<surfZone>& surfZones() const
|
||||
inline const UList<surfZone>& surfZones() const
|
||||
{
|
||||
return zones_;
|
||||
}
|
||||
|
||||
//- Const access to the faceMap, zero-sized when unused
|
||||
inline const List<label>& faceMap() const
|
||||
inline const labelUList& faceMap() const
|
||||
{
|
||||
return faceMap_;
|
||||
}
|
||||
@ -190,16 +191,25 @@ public:
|
||||
|
||||
// Write
|
||||
|
||||
//- Generic write routine. Chooses writer based on extension.
|
||||
virtual void write(const fileName& name) const
|
||||
//- Generic write routine. Chooses writer based on its extension.
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, *this);
|
||||
write(name, *this, options);
|
||||
}
|
||||
|
||||
//- Generic write routine. Chooses writer based on extension.
|
||||
virtual void write(const fileName& name, const word& ext) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const word& ext,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, ext, *this);
|
||||
write(name, ext, *this, options);
|
||||
}
|
||||
|
||||
//- Write to database
|
||||
|
||||
@ -83,8 +83,7 @@ public:
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~ModifiableMeshedSurface()
|
||||
{}
|
||||
virtual ~ModifiableMeshedSurface() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
@ -102,7 +102,21 @@ template<class Face>
|
||||
void Foam::UnsortedMeshedSurface<Face>::write
|
||||
(
|
||||
const fileName& name,
|
||||
const UnsortedMeshedSurface<Face>& surf
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
write(name, name.ext(), surf, options);
|
||||
}
|
||||
|
||||
|
||||
template<class Face>
|
||||
void Foam::UnsortedMeshedSurface<Face>::write
|
||||
(
|
||||
const fileName& name,
|
||||
const word& ext,
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
if (debug)
|
||||
@ -110,8 +124,6 @@ void Foam::UnsortedMeshedSurface<Face>::write
|
||||
InfoInFunction << "Writing to " << name << endl;
|
||||
}
|
||||
|
||||
const word ext = name.ext();
|
||||
|
||||
auto mfIter = writefileExtensionMemberFunctionTablePtr_->cfind(ext);
|
||||
|
||||
if (!mfIter.found())
|
||||
@ -121,7 +133,7 @@ void Foam::UnsortedMeshedSurface<Face>::write
|
||||
|
||||
if (delegate.found(ext))
|
||||
{
|
||||
MeshedSurfaceProxy<Face>(surf).write(name, ext);
|
||||
MeshedSurfaceProxy<Face>(surf).write(name, ext, options);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -134,7 +146,7 @@ void Foam::UnsortedMeshedSurface<Face>::write
|
||||
}
|
||||
else
|
||||
{
|
||||
mfIter()(name, surf);
|
||||
mfIter()(name, surf, options);
|
||||
}
|
||||
}
|
||||
|
||||
@ -230,7 +242,7 @@ Foam::UnsortedMeshedSurface<Face>::UnsortedMeshedSurface
|
||||
const Xfer<UnsortedMeshedSurface<Face>>& surf
|
||||
)
|
||||
:
|
||||
ParentType()
|
||||
UnsortedMeshedSurface<Face>()
|
||||
{
|
||||
transfer(surf());
|
||||
}
|
||||
@ -242,7 +254,7 @@ Foam::UnsortedMeshedSurface<Face>::UnsortedMeshedSurface
|
||||
const Xfer<MeshedSurface<Face>>& surf
|
||||
)
|
||||
:
|
||||
ParentType()
|
||||
UnsortedMeshedSurface<Face>()
|
||||
{
|
||||
transfer(surf());
|
||||
}
|
||||
@ -255,7 +267,7 @@ Foam::UnsortedMeshedSurface<Face>::UnsortedMeshedSurface
|
||||
const word& ext
|
||||
)
|
||||
:
|
||||
ParentType()
|
||||
UnsortedMeshedSurface<Face>()
|
||||
{
|
||||
read(name, ext);
|
||||
}
|
||||
@ -267,7 +279,7 @@ Foam::UnsortedMeshedSurface<Face>::UnsortedMeshedSurface
|
||||
const fileName& name
|
||||
)
|
||||
:
|
||||
ParentType()
|
||||
UnsortedMeshedSurface<Face>()
|
||||
{
|
||||
read(name);
|
||||
}
|
||||
@ -279,9 +291,7 @@ Foam::UnsortedMeshedSurface<Face>::UnsortedMeshedSurface
|
||||
Istream& is
|
||||
)
|
||||
:
|
||||
ParentType(),
|
||||
zoneIds_(),
|
||||
zoneToc_()
|
||||
UnsortedMeshedSurface<Face>()
|
||||
{
|
||||
read(is);
|
||||
}
|
||||
@ -294,20 +304,13 @@ Foam::UnsortedMeshedSurface<Face>::UnsortedMeshedSurface
|
||||
const word& surfName
|
||||
)
|
||||
:
|
||||
ParentType()
|
||||
UnsortedMeshedSurface<Face>()
|
||||
{
|
||||
MeshedSurface<Face> surf(t, surfName);
|
||||
transfer(surf);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
Foam::UnsortedMeshedSurface<Face>::~UnsortedMeshedSurface()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
@ -410,27 +413,28 @@ void Foam::UnsortedMeshedSurface<Face>::remapFaces
|
||||
)
|
||||
{
|
||||
// re-assign the zone Ids
|
||||
if (notNull(faceMap) && faceMap.size())
|
||||
if (isNull(faceMap) || faceMap.empty())
|
||||
{
|
||||
if (zoneToc_.empty())
|
||||
{
|
||||
setOneZone();
|
||||
}
|
||||
else if (zoneToc_.size() == 1)
|
||||
{
|
||||
// optimized for single-zone case
|
||||
zoneIds_ = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
List<label> newZones(faceMap.size());
|
||||
return;
|
||||
}
|
||||
|
||||
forAll(faceMap, facei)
|
||||
{
|
||||
newZones[facei] = zoneIds_[faceMap[facei]];
|
||||
}
|
||||
zoneIds_.transfer(newZones);
|
||||
if (zoneToc_.empty())
|
||||
{
|
||||
setOneZone();
|
||||
}
|
||||
else if (zoneToc_.size() == 1)
|
||||
{
|
||||
zoneIds_ = 0; // Optimized for single-zone case
|
||||
}
|
||||
else
|
||||
{
|
||||
List<label> newZones(faceMap.size());
|
||||
|
||||
forAll(faceMap, facei)
|
||||
{
|
||||
newZones[facei] = zoneIds_[faceMap[facei]];
|
||||
}
|
||||
zoneIds_.transfer(newZones);
|
||||
}
|
||||
}
|
||||
|
||||
@ -732,16 +736,14 @@ Foam::UnsortedMeshedSurface<Face>::xferZoneIds()
|
||||
template<class Face>
|
||||
bool Foam::UnsortedMeshedSurface<Face>::read(const fileName& name)
|
||||
{
|
||||
word ext = name.ext();
|
||||
const word ext(name.ext());
|
||||
if (ext == "gz")
|
||||
{
|
||||
fileName unzipName = name.lessExt();
|
||||
return read(unzipName, unzipName.ext());
|
||||
}
|
||||
else
|
||||
{
|
||||
return read(name, ext);
|
||||
}
|
||||
|
||||
return read(name, ext);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -50,9 +50,9 @@ SourceFiles
|
||||
#include "surfZoneIdentifierList.H"
|
||||
#include "surfZoneList.H"
|
||||
#include "surfaceFormatsCore.H"
|
||||
#include "HashSet.H"
|
||||
#include "runTimeSelectionTables.H"
|
||||
#include "memberFunctionSelectionTables.H"
|
||||
#include "HashSet.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -163,7 +163,10 @@ public:
|
||||
//- Can we write this file format?
|
||||
static bool canWriteType(const word& ext, const bool verbose=false);
|
||||
|
||||
//- Known readable file-types
|
||||
static wordHashSet readTypes();
|
||||
|
||||
//- Known writable file-types
|
||||
static wordHashSet writeTypes();
|
||||
|
||||
|
||||
@ -240,16 +243,16 @@ public:
|
||||
//- Select constructed from filename (explicit extension)
|
||||
static autoPtr<UnsortedMeshedSurface> New
|
||||
(
|
||||
const fileName&,
|
||||
const fileName& name,
|
||||
const word& ext
|
||||
);
|
||||
|
||||
//- Select constructed from filename (implicit extension)
|
||||
static autoPtr<UnsortedMeshedSurface> New(const fileName&);
|
||||
static autoPtr<UnsortedMeshedSurface> New(const fileName& name);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~UnsortedMeshedSurface();
|
||||
virtual ~UnsortedMeshedSurface() = default;
|
||||
|
||||
|
||||
// Member Function Selectors
|
||||
@ -262,16 +265,27 @@ public:
|
||||
fileExtension,
|
||||
(
|
||||
const fileName& name,
|
||||
const UnsortedMeshedSurface<Face>& surf
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options
|
||||
),
|
||||
(name, surf)
|
||||
(name, surf, options)
|
||||
);
|
||||
|
||||
//- Write to file
|
||||
//- Write to file, select based on its extension
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const UnsortedMeshedSurface<Face>&
|
||||
const fileName& name,
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
//- Write to file, selected based on given extension
|
||||
static void write
|
||||
(
|
||||
const fileName& name,
|
||||
const word& ext,
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options
|
||||
);
|
||||
|
||||
|
||||
@ -381,16 +395,20 @@ public:
|
||||
|
||||
// Write
|
||||
|
||||
//- Generic write routine. Chooses writer based on extension.
|
||||
virtual void write(const fileName& name) const
|
||||
//- Generic write routine. Chooses writer based on its extension.
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, *this);
|
||||
write(name, *this, options);
|
||||
}
|
||||
|
||||
//- Write to database
|
||||
void write
|
||||
(
|
||||
const Time&,
|
||||
const Time& t,
|
||||
const word& surfName = word::null
|
||||
) const;
|
||||
|
||||
|
||||
@ -30,7 +30,11 @@ License
|
||||
|
||||
template<class Face>
|
||||
Foam::autoPtr<Foam::UnsortedMeshedSurface<Face>>
|
||||
Foam::UnsortedMeshedSurface<Face>::New(const fileName& name, const word& ext)
|
||||
Foam::UnsortedMeshedSurface<Face>::New
|
||||
(
|
||||
const fileName& name,
|
||||
const word& ext
|
||||
)
|
||||
{
|
||||
if (debug)
|
||||
{
|
||||
|
||||
@ -50,12 +50,6 @@ Foam::mergedSurf::mergedSurf
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::mergedSurf::~mergedSurf()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
bool Foam::mergedSurf::use()
|
||||
|
||||
@ -72,7 +72,7 @@ public:
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~mergedSurf();
|
||||
virtual ~mergedSurf() = default;
|
||||
|
||||
|
||||
// Access Member Functions
|
||||
|
||||
@ -34,7 +34,7 @@ Description
|
||||
|
||||
#include "pointField.H"
|
||||
#include "faceList.H"
|
||||
#include "ListOps.H"
|
||||
#include "labelList.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -52,13 +52,11 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
meshedSurf()
|
||||
{}
|
||||
meshedSurf() = default;
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~meshedSurf()
|
||||
{}
|
||||
virtual ~meshedSurf() = default;
|
||||
|
||||
|
||||
// Access Member Functions
|
||||
|
||||
@ -33,7 +33,6 @@ Description
|
||||
#define meshedSurfRef_H
|
||||
|
||||
#include "meshedSurf.H"
|
||||
#include "labelList.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -63,8 +62,6 @@ class meshedSurfRef
|
||||
|
||||
public:
|
||||
|
||||
// Public Member Functions
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from components
|
||||
@ -82,8 +79,7 @@ public:
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~meshedSurfRef()
|
||||
{}
|
||||
virtual ~meshedSurfRef() = default;
|
||||
|
||||
|
||||
// Access Member Functions
|
||||
|
||||
@ -424,9 +424,9 @@ void Foam::surfMesh::addZones
|
||||
{
|
||||
surfZoneList& zones = Allocator::storedIOZones();
|
||||
|
||||
forAll(zones, zoneI)
|
||||
forAll(zones, zonei)
|
||||
{
|
||||
zones[zoneI] = surfZone(srfZones[zoneI], zoneI);
|
||||
zones[zonei] = surfZone(srfZones[zonei], zonei);
|
||||
}
|
||||
|
||||
if (validate)
|
||||
@ -452,20 +452,29 @@ void Foam::surfMesh::removeFiles() const
|
||||
}
|
||||
|
||||
|
||||
void Foam::surfMesh::write(const fileName& name, const surfMesh& surf)
|
||||
void Foam::surfMesh::write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options
|
||||
) const
|
||||
{
|
||||
MeshedSurfaceProxy<face>
|
||||
(
|
||||
surf.points(),
|
||||
surf.faces(),
|
||||
surf.surfZones()
|
||||
).write(name);
|
||||
write(name, name.ext(), options);
|
||||
}
|
||||
|
||||
|
||||
void Foam::surfMesh::write(const fileName& name)
|
||||
void Foam::surfMesh::write
|
||||
(
|
||||
const fileName& name,
|
||||
const word& ext,
|
||||
const dictionary& options
|
||||
) const
|
||||
{
|
||||
write(name, *this);
|
||||
MeshedSurfaceProxy<face>
|
||||
(
|
||||
this->points(),
|
||||
this->faces(),
|
||||
this->surfZones()
|
||||
).write(name, ext, options);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -69,7 +69,7 @@ public:
|
||||
|
||||
//- Enumeration defining the state of the mesh after a read update.
|
||||
// Used for post-processing applications, where the mesh
|
||||
// needs to update based on the files written in time directores
|
||||
// needs to update based on the files written in time directories
|
||||
enum readUpdateState
|
||||
{
|
||||
UNCHANGED,
|
||||
@ -157,7 +157,7 @@ public:
|
||||
//- Construct from IOobject, with alternative surface name
|
||||
explicit surfMesh
|
||||
(
|
||||
const IOobject&,
|
||||
const IOobject& io,
|
||||
const word& surfName = word::null
|
||||
);
|
||||
|
||||
@ -165,16 +165,16 @@ public:
|
||||
// surfZones are added using addZones() member function
|
||||
surfMesh
|
||||
(
|
||||
const IOobject&,
|
||||
const Xfer<pointField>&,
|
||||
const Xfer<faceList>&,
|
||||
const IOobject& io,
|
||||
const Xfer<pointField>& pointLst,
|
||||
const Xfer<faceList>& faceLst,
|
||||
const word& surfName = word::null
|
||||
);
|
||||
|
||||
//- Construct copy/move from MeshedSurface
|
||||
surfMesh
|
||||
(
|
||||
const IOobject&,
|
||||
const IOobject& io,
|
||||
const Xfer<MeshedSurface<face>>& surf,
|
||||
const word& surfName = word::null
|
||||
);
|
||||
@ -192,7 +192,7 @@ public:
|
||||
fileName meshDir() const;
|
||||
|
||||
//- Return the current instance directory for points
|
||||
// Used in the consruction of geometric mesh data dependent
|
||||
// Used in the construction of geometric mesh data dependent
|
||||
// on points
|
||||
const fileName& pointsInstance() const;
|
||||
|
||||
@ -262,7 +262,7 @@ public:
|
||||
//- Add surface zones
|
||||
void addZones
|
||||
(
|
||||
const List<surfZone>&,
|
||||
const surfZoneList& srfZones,
|
||||
const bool validate = true
|
||||
);
|
||||
|
||||
@ -294,7 +294,7 @@ public:
|
||||
|
||||
|
||||
//- Transfer the contents of the argument and annul the argument
|
||||
void transfer(MeshedSurface<face>&);
|
||||
void transfer(MeshedSurface<face>& surf);
|
||||
|
||||
|
||||
// Writing
|
||||
@ -311,11 +311,23 @@ public:
|
||||
const bool valid
|
||||
) const;
|
||||
|
||||
//- Write to file
|
||||
static void write(const fileName&, const surfMesh&);
|
||||
|
||||
//- Write to file
|
||||
void write(const fileName&);
|
||||
//- Write to file, choosing writer based on its extension.
|
||||
// Uses MeshedSurfaceProxy for writing.
|
||||
void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const;
|
||||
|
||||
//- Write to file, choosing writer given extension.
|
||||
// Uses MeshedSurfaceProxy for writing.
|
||||
void write
|
||||
(
|
||||
const fileName& name,
|
||||
const word& ext,
|
||||
const dictionary& options = dictionary::null
|
||||
) const;
|
||||
|
||||
|
||||
// Storage management
|
||||
|
||||
@ -62,29 +62,32 @@ bool Foam::fileFormats::AC3DsurfaceFormat<Face>::read
|
||||
|
||||
is.getLine(line);
|
||||
|
||||
string version = line.substr(4);
|
||||
|
||||
if (version != "b")
|
||||
// Verify version
|
||||
{
|
||||
WarningInFunction
|
||||
<< "When reading AC3D file " << filename
|
||||
<< " read header " << line << " with version "
|
||||
<< version << endl
|
||||
<< "Only tested reading with version 'b'."
|
||||
<< " This might give problems" << endl;
|
||||
const string version = line.substr(4);
|
||||
|
||||
if (version != "b")
|
||||
{
|
||||
WarningInFunction
|
||||
<< "When reading AC3D file " << filename
|
||||
<< " read header " << line << " with version "
|
||||
<< version << endl
|
||||
<< "Only tested reading with version 'b'."
|
||||
<< " This might give problems" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!cueTo(is, "OBJECT", args) || (args != "world"))
|
||||
if (!cueTo(is, "OBJECT", args) || args != "world")
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Cannot find \"OBJECT world\" in file " << filename
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
// # of kids is the # of zones
|
||||
// Number of kids is the number of zones
|
||||
args = cueToOrDie(is, "kids");
|
||||
label nZones = parse<int>(args);
|
||||
const label nZones = parse<int>(args);
|
||||
|
||||
// Start of vertices for object/zones
|
||||
label vertexOffset = 0;
|
||||
@ -170,11 +173,11 @@ bool Foam::fileFormats::AC3DsurfaceFormat<Face>::read
|
||||
}
|
||||
else if (cmd == "numsurf")
|
||||
{
|
||||
label nFaces = parse<int>(args);
|
||||
const label nFaces = parse<int>(args);
|
||||
|
||||
for (label facei = 0; facei < nFaces; ++facei)
|
||||
{
|
||||
static string errorMsg =
|
||||
const string errorMsg =
|
||||
string(" while reading face ")
|
||||
+ Foam::name(facei) + " on zone "
|
||||
+ Foam::name(zoneI)
|
||||
@ -184,13 +187,13 @@ bool Foam::fileFormats::AC3DsurfaceFormat<Face>::read
|
||||
cueToOrDie(is, "mat", errorMsg);
|
||||
args = cueToOrDie(is, "refs", errorMsg);
|
||||
|
||||
label nVert = parse<int>(args);
|
||||
const label nVert = parse<int>(args);
|
||||
|
||||
List<label> verts(nVert);
|
||||
forAll(verts, vertI)
|
||||
{
|
||||
is.getLine(line);
|
||||
verts[vertI] = parse<int>(line) + vertexOffset;
|
||||
verts[vertI] = vertexOffset + parse<int>(line);
|
||||
}
|
||||
|
||||
const labelUList& f = static_cast<const labelUList&>(verts);
|
||||
@ -221,7 +224,7 @@ bool Foam::fileFormats::AC3DsurfaceFormat<Face>::read
|
||||
else if (cmd == "kids")
|
||||
{
|
||||
// 'kids' denotes the end of the current zone.
|
||||
label nKids = parse<int>(args);
|
||||
const label nKids = parse<int>(args);
|
||||
|
||||
if (nKids != 0)
|
||||
{
|
||||
@ -275,26 +278,22 @@ static void writeZone
|
||||
|
||||
os << "numvert " << patch.nPoints() << nl;
|
||||
|
||||
forAll(patch.localPoints(), pti)
|
||||
for (const point& pt : patch.localPoints())
|
||||
{
|
||||
const point& pt = patch.localPoints()[pti];
|
||||
|
||||
os << pt.x() << ' ' << pt.y() << ' ' << pt.z() << nl;
|
||||
}
|
||||
|
||||
os << "numsurf " << patch.size() << nl;
|
||||
|
||||
forAll(patch.localFaces(), facei)
|
||||
for (const Face& f : patch.localFaces())
|
||||
{
|
||||
const Face& f = patch.localFaces()[facei];
|
||||
|
||||
os << "SURF 0x20" << nl // polygon
|
||||
<< "mat " << zoneI << nl
|
||||
<< "refs " << f.size() << nl;
|
||||
|
||||
forAll(f, fp)
|
||||
for (const label verti : f)
|
||||
{
|
||||
os << f[fp] << " 0 0" << nl;
|
||||
os << verti << " 0 0" << nl;
|
||||
}
|
||||
}
|
||||
|
||||
@ -306,13 +305,14 @@ template<class Face>
|
||||
void Foam::fileFormats::AC3DsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary&
|
||||
)
|
||||
{
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
|
||||
const List<surfZone>& zones =
|
||||
const UList<surfZone>& zones =
|
||||
(
|
||||
surf.surfZones().size()
|
||||
? surf.surfZones()
|
||||
@ -342,10 +342,9 @@ void Foam::fileFormats::AC3DsurfaceFormat<Face>::write
|
||||
return;
|
||||
}
|
||||
|
||||
forAll(zones, zoneI)
|
||||
label zoneIndex = 0;
|
||||
for (const surfZone& zone : zones)
|
||||
{
|
||||
const surfZone& zone = zones[zoneI];
|
||||
|
||||
if (useFaceMap)
|
||||
{
|
||||
SubList<label> zoneMap(surf.faceMap(), zone.size(), zone.start());
|
||||
@ -355,7 +354,7 @@ void Foam::fileFormats::AC3DsurfaceFormat<Face>::write
|
||||
pointLst
|
||||
);
|
||||
|
||||
writeZone(os, patch, zone.name(), zoneI);
|
||||
writeZone(os, patch, zone.name(), zoneIndex);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -365,8 +364,10 @@ void Foam::fileFormats::AC3DsurfaceFormat<Face>::write
|
||||
pointLst
|
||||
);
|
||||
|
||||
writeZone(os, patch, zone.name(), zoneI);
|
||||
writeZone(os, patch, zone.name(), zoneIndex);
|
||||
}
|
||||
|
||||
++zoneIndex;
|
||||
}
|
||||
}
|
||||
|
||||
@ -375,7 +376,8 @@ template<class Face>
|
||||
void Foam::fileFormats::AC3DsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary&
|
||||
)
|
||||
{
|
||||
OFstream os(filename);
|
||||
@ -404,10 +406,10 @@ void Foam::fileFormats::AC3DsurfaceFormat<Face>::write
|
||||
}
|
||||
|
||||
writeHeader(os, zoneLst);
|
||||
forAll(zoneLst, zoneI)
|
||||
{
|
||||
const surfZone& zone = zoneLst[zoneI];
|
||||
|
||||
label zoneIndex = 0;
|
||||
for (const surfZone& zone : zoneLst)
|
||||
{
|
||||
SubList<label> zoneMap(faceMap, zone.size(), zone.start());
|
||||
PrimitivePatch<Face, UIndirectList, const pointField&> patch
|
||||
(
|
||||
@ -415,7 +417,9 @@ void Foam::fileFormats::AC3DsurfaceFormat<Face>::write
|
||||
surf.points()
|
||||
);
|
||||
|
||||
writeZone(os, patch, zone.name(), zoneI);
|
||||
writeZone(os, patch, zone.name(), zoneIndex);
|
||||
|
||||
++zoneIndex;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -25,7 +25,7 @@ Class
|
||||
Foam::fileFormats::AC3DsurfaceFormat
|
||||
|
||||
Description
|
||||
Provide a means of reading/writing AC3D format.
|
||||
Read/write AC3D format.
|
||||
|
||||
http://www.inivis.com/ac3d/man/ac3dfileformat.html
|
||||
|
||||
@ -55,7 +55,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class AC3DsurfaceFormat Declaration
|
||||
Class fileFormats::AC3DsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -78,49 +78,45 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from file name
|
||||
AC3DsurfaceFormat(const fileName&);
|
||||
|
||||
|
||||
// Selectors
|
||||
|
||||
//- Read file and return surface
|
||||
static autoPtr<MeshedSurface<Face>> New(const fileName& name)
|
||||
{
|
||||
return autoPtr<MeshedSurface<Face>>
|
||||
(
|
||||
new AC3DsurfaceFormat<Face>(name)
|
||||
);
|
||||
}
|
||||
AC3DsurfaceFormat(const fileName& filename);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~AC3DsurfaceFormat()
|
||||
{}
|
||||
virtual ~AC3DsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
//- Write UnsortedMeshedSurface, the output is always sorted by zones.
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const UnsortedMeshedSurface<Face>&
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Read from file
|
||||
virtual bool read(const fileName&);
|
||||
virtual bool read(const fileName& filename);
|
||||
|
||||
//- Write object
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this));
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -28,6 +28,22 @@ License
|
||||
#include "IFstream.H"
|
||||
#include "StringStream.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
|
||||
// Define 8 standard colours as r,g,b components
|
||||
static float colourMap[] =
|
||||
{
|
||||
1, 1, 1,
|
||||
1, 0, 0,
|
||||
0, 1, 0,
|
||||
0, 0, 1,
|
||||
1, 1, 0,
|
||||
0, 1, 1,
|
||||
1, 0, 1,
|
||||
0.5, 0.5, 1
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||
|
||||
bool Foam::fileFormats::AC3DsurfaceFormatCore::readCmd
|
||||
@ -42,9 +58,9 @@ bool Foam::fileFormats::AC3DsurfaceFormatCore::readCmd
|
||||
string line;
|
||||
is.getLine(line);
|
||||
|
||||
string::size_type space = line.find(' ');
|
||||
const auto space = line.find(' ');
|
||||
|
||||
if (space != string::npos)
|
||||
if (space && space != string::npos)
|
||||
{
|
||||
cmd = line.substr(0, space);
|
||||
args = line.substr(space+1);
|
||||
@ -52,12 +68,11 @@ bool Foam::fileFormats::AC3DsurfaceFormatCore::readCmd
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Read up to line starting with cmd. Sets args to rest of line.
|
||||
// Returns true if found, false if stream is not good anymore.
|
||||
bool Foam::fileFormats::AC3DsurfaceFormatCore::cueTo
|
||||
(
|
||||
IFstream& is,
|
||||
@ -70,23 +85,20 @@ bool Foam::fileFormats::AC3DsurfaceFormatCore::cueTo
|
||||
string line;
|
||||
is.getLine(line);
|
||||
|
||||
string::size_type space = line.find(' ');
|
||||
const auto space = line.find(' ');
|
||||
|
||||
if (space != string::npos)
|
||||
if (space && space != string::npos && cmd == line.substr(0, space))
|
||||
{
|
||||
if (line.substr(0, space) == cmd)
|
||||
{
|
||||
args = line.substr(space+1);
|
||||
args = line.substr(space+1);
|
||||
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Similar to cueTo(), but throws error if cmd not found
|
||||
Foam::string Foam::fileFormats::AC3DsurfaceFormatCore::cueToOrDie
|
||||
(
|
||||
IFstream& is,
|
||||
@ -110,35 +122,22 @@ Foam::string Foam::fileFormats::AC3DsurfaceFormatCore::cueToOrDie
|
||||
void Foam::fileFormats::AC3DsurfaceFormatCore::writeHeader
|
||||
(
|
||||
Ostream& os,
|
||||
const UList<surfZone>& zoneLst
|
||||
const UList<surfZone>& zones
|
||||
)
|
||||
{
|
||||
// Write with zones as separate objects under "world" object.
|
||||
// Header is taken over from sample file.
|
||||
// Defines separate materials for all zones. Recycle colours.
|
||||
|
||||
// Define 8 standard colours as r,g,b components
|
||||
static scalar colourMap[] =
|
||||
{
|
||||
1, 1, 1,
|
||||
1, 0, 0,
|
||||
0, 1, 0,
|
||||
0, 0, 1,
|
||||
1, 1, 0,
|
||||
0, 1, 1,
|
||||
1, 0, 1,
|
||||
0.5, 0.5, 1
|
||||
};
|
||||
|
||||
// Write header. Define materials.
|
||||
os << "AC3Db" << nl;
|
||||
|
||||
forAll(zoneLst, zoneI)
|
||||
forAll(zones, zonei)
|
||||
{
|
||||
label colourI = zoneI % 8;
|
||||
label colourCompI = 3 * colourI;
|
||||
const label colourI = zonei % 8;
|
||||
const label colourCompI = 3 * colourI;
|
||||
|
||||
os << "MATERIAL \"" << zoneLst[zoneI].name() << "Mat\" rgb "
|
||||
os << "MATERIAL \"" << zones[zonei].name() << "Mat\" rgb "
|
||||
<< colourMap[colourCompI] << ' ' << colourMap[colourCompI+1]
|
||||
<< ' ' << colourMap[colourCompI+2]
|
||||
<< " amb 0.2 0.2 0.2 emis 0 0 0 spec 0.5 0.5 0.5 shi 10"
|
||||
@ -147,7 +146,7 @@ void Foam::fileFormats::AC3DsurfaceFormatCore::writeHeader
|
||||
}
|
||||
|
||||
os << "OBJECT world" << nl
|
||||
<< "kids " << zoneLst.size() << endl;
|
||||
<< "kids " << zones.size() << endl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -36,8 +36,7 @@ SourceFiles
|
||||
#define AC3DsurfaceFormatCore_H
|
||||
|
||||
#include "Fstream.H"
|
||||
#include "Ostream.H"
|
||||
#include "MeshedSurface.H"
|
||||
#include "surfZone.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -47,27 +46,32 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class AC3DsurfaceFormatCore Declaration
|
||||
Class fileFormats::AC3DsurfaceFormatCore Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class AC3DsurfaceFormatCore
|
||||
{
|
||||
protected:
|
||||
|
||||
// Protected Member Functions
|
||||
// Protected Static Member Functions
|
||||
|
||||
//- Read a type via IStringStream
|
||||
template<class Type>
|
||||
static Type parse(const string&);
|
||||
static Type parse(const string& str);
|
||||
|
||||
//- Read cmd, args from IFstream
|
||||
static bool readCmd(IFstream&, string& cmd, string& args);
|
||||
// The cmd is the content up to the first space, args is the balance
|
||||
// of the line (after the space).
|
||||
// \return if the command was read
|
||||
static bool readCmd(IFstream& is, string& cmd, string& args);
|
||||
|
||||
//- Cue up to cmd, reading args
|
||||
//- Read up to a line starting with cmd. Sets args to rest of line.
|
||||
//
|
||||
// \return true if found, false if stream is not good anymore.
|
||||
static bool cueTo(IFstream&, const string& cmd, string& args);
|
||||
|
||||
//- Cue up to cmd, reading args or exit with a FatalError
|
||||
// returns the command args
|
||||
//- Like cueTo(), but FatalError if not found.
|
||||
// \return the command args on success
|
||||
static string cueToOrDie
|
||||
(
|
||||
IFstream&,
|
||||
@ -75,8 +79,8 @@ protected:
|
||||
const string& errorMsg=string::null
|
||||
);
|
||||
|
||||
//- Write header with materials
|
||||
static void writeHeader(Ostream&, const UList<surfZone>&);
|
||||
//- Write header with materials for each zone
|
||||
static void writeHeader(Ostream& os, const UList<surfZone>& zones);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -29,12 +29,13 @@ License
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
template<class Type>
|
||||
Type Foam::fileFormats::AC3DsurfaceFormatCore::parse(const string& s)
|
||||
Type Foam::fileFormats::AC3DsurfaceFormatCore::parse(const string& str)
|
||||
{
|
||||
IStringStream ss(s);
|
||||
IStringStream is(str);
|
||||
|
||||
Type t;
|
||||
ss >> t;
|
||||
is >> t;
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -34,7 +34,7 @@ inline static void newline(Foam::OSstream& os)
|
||||
{
|
||||
if (os.format() == Foam::IOstream::ASCII)
|
||||
{
|
||||
os << Foam::endl;
|
||||
os << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
@ -61,9 +61,9 @@ inline void Foam::fileFormats::FLMAsurfaceFormat<Face>::writeShell
|
||||
if (f.size() == 3 || f.size() == 4)
|
||||
{
|
||||
putFireLabel(os, f.size());
|
||||
forAll(f, fp)
|
||||
for (const label verti : f)
|
||||
{
|
||||
putFireLabel(os, f[fp]);
|
||||
putFireLabel(os, verti);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -72,7 +72,7 @@ inline void Foam::fileFormats::FLMAsurfaceFormat<Face>::writeShell
|
||||
// better triangulation should have been done before
|
||||
for (label fp1 = 1; fp1 < f.size() - 1; ++fp1)
|
||||
{
|
||||
label fp2 = f.fcIndex(fp1);
|
||||
const label fp2 = f.fcIndex(fp1);
|
||||
|
||||
putFireLabel(os, 3);
|
||||
putFireLabel(os, f[0]);
|
||||
@ -87,9 +87,9 @@ inline void Foam::fileFormats::FLMAsurfaceFormat<Face>::writeShell
|
||||
if (f.size() == 3 || f.size() == 4)
|
||||
{
|
||||
os << ' ' << f.size();
|
||||
forAll(f, fp)
|
||||
for (const label verti : f)
|
||||
{
|
||||
os << ' ' << f[fp];
|
||||
os << ' ' << verti;
|
||||
}
|
||||
os << nl;
|
||||
}
|
||||
@ -97,7 +97,7 @@ inline void Foam::fileFormats::FLMAsurfaceFormat<Face>::writeShell
|
||||
{
|
||||
for (label fp1 = 1; fp1 < f.size() - 1; ++fp1)
|
||||
{
|
||||
label fp2 = f.fcIndex(fp1);
|
||||
const label fp2 = f.fcIndex(fp1);
|
||||
os << ' ' << 3 << ' '
|
||||
<< f[0] << ' ' << f[fp1] << ' ' << f[fp2]
|
||||
<< nl;
|
||||
@ -164,9 +164,9 @@ void Foam::fileFormats::FLMAsurfaceFormat<Face>::write
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& faceMap = surf.faceMap();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& faceMap = surf.faceMap();
|
||||
|
||||
// for no zones, suppress the group name
|
||||
const List<surfZone>& zones =
|
||||
@ -222,10 +222,10 @@ void Foam::fileFormats::FLMAsurfaceFormat<Face>::write
|
||||
putFireLabel(os, pointLst.size());
|
||||
newline(os);
|
||||
|
||||
forAll(pointLst, ptI)
|
||||
for (const point& pt : pointLst)
|
||||
{
|
||||
// scaling is normally 1
|
||||
putFirePoint(os, pointLst[ptI]);
|
||||
putFirePoint(os, pt);
|
||||
}
|
||||
newline(os); // readability
|
||||
|
||||
@ -236,20 +236,20 @@ void Foam::fileFormats::FLMAsurfaceFormat<Face>::write
|
||||
newline(os);
|
||||
|
||||
label faceIndex = 0;
|
||||
forAll(zones, zoneI)
|
||||
for (const surfZone& zone : zones)
|
||||
{
|
||||
const surfZone& zone = zones[zoneI];
|
||||
const label nLocalFaces = zone.size();
|
||||
|
||||
if (useFaceMap)
|
||||
{
|
||||
forAll(zone, localFaceI)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
writeShell(os, faceLst[faceMap[faceIndex++]]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
forAll(zone, localFaceI)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
writeShell(os, faceLst[faceIndex++]);
|
||||
}
|
||||
@ -266,20 +266,20 @@ void Foam::fileFormats::FLMAsurfaceFormat<Face>::write
|
||||
newline(os);
|
||||
|
||||
label faceIndex = 0;
|
||||
forAll(zones, zoneI)
|
||||
for (const surfZone& zone : zones)
|
||||
{
|
||||
const surfZone& zone = zones[zoneI];
|
||||
const label nLocalFaces = zone.size();
|
||||
|
||||
if (useFaceMap)
|
||||
{
|
||||
forAll(zone, localFaceI)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
writeType(os, faceLst[faceMap[faceIndex++]]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
forAll(zone, localFaceI)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
writeType(os, faceLst[faceIndex++]);
|
||||
}
|
||||
@ -316,9 +316,9 @@ void Foam::fileFormats::FLMAsurfaceFormat<Face>::write
|
||||
template<class Face>
|
||||
void Foam::fileFormats::FLMAsurfaceFormat<Face>::write
|
||||
(
|
||||
bool compress,
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
bool compress
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
)
|
||||
{
|
||||
autoPtr<OFstream> osPtr
|
||||
@ -361,10 +361,11 @@ template<class Face>
|
||||
void Foam::fileFormats::FLMAsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary&
|
||||
)
|
||||
{
|
||||
write(filename, surf, false);
|
||||
write(false, filename, surf);
|
||||
}
|
||||
|
||||
|
||||
@ -372,10 +373,11 @@ template<class Face>
|
||||
void Foam::fileFormats::FLMAZsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary&
|
||||
)
|
||||
{
|
||||
FLMAsurfaceFormat<Face>::write(filename, surf, true);
|
||||
FLMAsurfaceFormat<Face>::write(true, filename, surf);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -47,7 +47,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class FLMAsurfaceFormat Declaration
|
||||
Class fileFormats::FLMAsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -58,8 +58,8 @@ class FLMAsurfaceFormat
|
||||
{
|
||||
// Private Member Functions
|
||||
|
||||
static inline void writeShell(OSstream&, const Face&);
|
||||
static inline void writeType(OSstream&, const Face&);
|
||||
static inline void writeShell(OSstream& os, const Face& f);
|
||||
static inline void writeType(OSstream& os, const Face& f);
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
FLMAsurfaceFormat(const FLMAsurfaceFormat<Face>&) = delete;
|
||||
@ -75,17 +75,17 @@ protected:
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
OSstream&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
OSstream& os,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
);
|
||||
|
||||
|
||||
//- Write surface mesh components by proxy with/without compression
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&,
|
||||
bool compress
|
||||
bool compress,
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
);
|
||||
|
||||
|
||||
@ -94,28 +94,34 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
FLMAsurfaceFormat()
|
||||
{}
|
||||
FLMAsurfaceFormat() = default;
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~FLMAsurfaceFormat()
|
||||
{}
|
||||
virtual ~FLMAsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Write flma file
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this));
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
|
||||
};
|
||||
@ -144,28 +150,34 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
FLMAZsurfaceFormat()
|
||||
{}
|
||||
FLMAZsurfaceFormat() = default;
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~FLMAZsurfaceFormat()
|
||||
{}
|
||||
virtual ~FLMAZsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Write flmaz file
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this));
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@ -30,6 +30,40 @@ License
|
||||
#include "StringStream.H"
|
||||
#include "faceTraits.H"
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
bool Foam::fileFormats::GTSsurfaceFormat<Face>::checkIfTriangulated
|
||||
(
|
||||
const UList<Face>& faceLst
|
||||
)
|
||||
{
|
||||
label nNonTris = 0;
|
||||
|
||||
if (!faceTraits<Face>::isTri())
|
||||
{
|
||||
for (const auto& f : faceLst)
|
||||
{
|
||||
if (f.size() != 3)
|
||||
{
|
||||
++nNonTris;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (nNonTris)
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Surface has " << nNonTris << "/" << faceLst.size()
|
||||
<< " non-triangulated faces - not writing!" << endl;
|
||||
}
|
||||
|
||||
return nNonTris == 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
@ -96,7 +130,7 @@ bool Foam::fileFormats::GTSsurfaceFormat<Face>::read
|
||||
pointLst[pointi] = point(x, y, z);
|
||||
}
|
||||
|
||||
// Read edges (Foam indexing)
|
||||
// Read edges (OpenFOAM indexing)
|
||||
edgeList edges(nEdges);
|
||||
forAll(edges, edgei)
|
||||
{
|
||||
@ -159,10 +193,10 @@ bool Foam::fileFormats::GTSsurfaceFormat<Face>::read
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
label e0Far = e0.otherVertex(common01);
|
||||
label e1Far = e1.otherVertex(common01);
|
||||
const label e0Far = e0.otherVertex(common01);
|
||||
const label e1Far = e1.otherVertex(common01);
|
||||
|
||||
label common12 = e1.commonVertex(e2);
|
||||
const label common12 = e1.commonVertex(e2);
|
||||
if (common12 == -1)
|
||||
{
|
||||
FatalErrorInFunction
|
||||
@ -172,7 +206,7 @@ bool Foam::fileFormats::GTSsurfaceFormat<Face>::read
|
||||
<< " edge2:" << e2
|
||||
<< exit(FatalError);
|
||||
}
|
||||
label e2Far = e2.otherVertex(common12);
|
||||
const label e2Far = e2.otherVertex(common12);
|
||||
|
||||
// Does edge2 sit between edge1 and 0?
|
||||
if (common12 != e1Far || e2Far != e0Far)
|
||||
@ -212,41 +246,21 @@ template<class Face>
|
||||
void Foam::fileFormats::GTSsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurface<Face>& surf
|
||||
const MeshedSurface<Face>& surf,
|
||||
const dictionary&
|
||||
)
|
||||
{
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
|
||||
const List<surfZone>& zones =
|
||||
const UList<surfZone>& zones =
|
||||
(
|
||||
surf.surfZones().size()
|
||||
? surf.surfZones()
|
||||
: surfaceFormatsCore::oneZone(faceLst)
|
||||
);
|
||||
|
||||
// check if output triangulation would be required
|
||||
// It is too annoying to triangulate on-the-fly
|
||||
// just issue a warning and get out
|
||||
if (!faceTraits<Face>::isTri())
|
||||
{
|
||||
label nNonTris = 0;
|
||||
forAll(faceLst, facei)
|
||||
{
|
||||
if (faceLst[facei].size() != 3)
|
||||
{
|
||||
++nNonTris;
|
||||
}
|
||||
}
|
||||
|
||||
if (nNonTris)
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Surface has " << nNonTris << "/" << faceLst.size()
|
||||
<< " non-triangulated faces - not writing!" << endl;
|
||||
return;
|
||||
}
|
||||
}
|
||||
checkIfTriangulated(faceLst);
|
||||
|
||||
OFstream os(filename);
|
||||
if (!os.good())
|
||||
@ -270,14 +284,12 @@ void Foam::fileFormats::GTSsurfaceFormat<Face>::write
|
||||
|
||||
os << "# nPoints nEdges nTriangles" << nl
|
||||
<< pointLst.size() << ' ' << surf.nEdges() << ' '
|
||||
<< surf.size() << endl;
|
||||
<< surf.size() << nl;
|
||||
|
||||
|
||||
// Write vertex coords
|
||||
forAll(pointLst, pointi)
|
||||
for (const point& pt : pointLst)
|
||||
{
|
||||
const point& pt = pointLst[pointi];
|
||||
|
||||
os << pt.x() << ' ' << pt.y() << ' ' << pt.z() << nl;
|
||||
}
|
||||
|
||||
@ -287,29 +299,32 @@ void Foam::fileFormats::GTSsurfaceFormat<Face>::write
|
||||
const edgeList& es = surf.edges();
|
||||
const labelList& meshPts = surf.meshPoints();
|
||||
|
||||
forAll(es, edgei)
|
||||
for (const edge& e : es)
|
||||
{
|
||||
os << meshPts[es[edgei].start()] + 1 << ' '
|
||||
<< meshPts[es[edgei].end()] + 1 << endl;
|
||||
os << meshPts[e.start()] + 1 << ' '
|
||||
<< meshPts[e.end()] + 1 << nl;
|
||||
}
|
||||
|
||||
// Write faces in terms of edges.
|
||||
const labelListList& faceEs = surf.faceEdges();
|
||||
|
||||
label faceIndex = 0;
|
||||
forAll(zones, zoneI)
|
||||
label zoneIndex = 0;
|
||||
for (const surfZone& zone : zones)
|
||||
{
|
||||
const surfZone& zone = zones[zoneI];
|
||||
const label nLocalFaces = zone.size();
|
||||
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const labelList& fEdges = faceEs[faceIndex++];
|
||||
|
||||
os << fEdges[0] + 1 << ' '
|
||||
<< fEdges[1] + 1 << ' '
|
||||
<< fEdges[2] + 1 << ' '
|
||||
<< zoneI << endl;
|
||||
<< zoneIndex << nl;
|
||||
}
|
||||
|
||||
++zoneIndex;
|
||||
}
|
||||
}
|
||||
|
||||
@ -318,36 +333,16 @@ template<class Face>
|
||||
void Foam::fileFormats::GTSsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary&
|
||||
)
|
||||
{
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& zoneIds = surf.zoneIds();
|
||||
const List<surfZoneIdentifier>& zoneToc = surf.zoneToc();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& zoneIds = surf.zoneIds();
|
||||
const UList<surfZoneIdentifier>& zoneToc = surf.zoneToc();
|
||||
|
||||
// check if output triangulation would be required
|
||||
// It is too annoying to triangulate on-the-fly
|
||||
// just issue a warning and get out
|
||||
if (!faceTraits<Face>::isTri())
|
||||
{
|
||||
label nNonTris = 0;
|
||||
forAll(faceLst, facei)
|
||||
{
|
||||
if (faceLst[facei].size() != 3)
|
||||
{
|
||||
++nNonTris;
|
||||
}
|
||||
}
|
||||
|
||||
if (nNonTris)
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Surface has " << nNonTris << "/" << faceLst.size()
|
||||
<< " non-triangulated faces - not writing!" << endl;
|
||||
return;
|
||||
}
|
||||
}
|
||||
checkIfTriangulated(faceLst);
|
||||
|
||||
OFstream os(filename);
|
||||
if (!os.good())
|
||||
@ -367,20 +362,18 @@ void Foam::fileFormats::GTSsurfaceFormat<Face>::write
|
||||
os << "# " << zoneI << " "
|
||||
<< zoneToc[zoneI].name() << nl;
|
||||
}
|
||||
os << "#" << endl;
|
||||
os << "#" << nl;
|
||||
|
||||
|
||||
os << "# nPoints nEdges nTriangles" << nl
|
||||
<< pointLst.size() << ' ' << surf.nEdges() << ' '
|
||||
<< surf.size() << endl;
|
||||
<< surf.size() << nl;
|
||||
|
||||
|
||||
// Write vertex coords
|
||||
forAll(pointLst, pointi)
|
||||
for (const point& pt : pointLst)
|
||||
{
|
||||
os << pointLst[pointi].x() << ' '
|
||||
<< pointLst[pointi].y() << ' '
|
||||
<< pointLst[pointi].z() << endl;
|
||||
os << pt.x() << ' ' << pt.y() << ' ' << pt.z() << nl;
|
||||
}
|
||||
|
||||
|
||||
@ -389,13 +382,12 @@ void Foam::fileFormats::GTSsurfaceFormat<Face>::write
|
||||
const edgeList& es = surf.edges();
|
||||
const labelList& meshPts = surf.meshPoints();
|
||||
|
||||
forAll(es, edgeI)
|
||||
for (const edge& e : es)
|
||||
{
|
||||
os << meshPts[es[edgeI].start()] + 1 << ' '
|
||||
<< meshPts[es[edgeI].end()] + 1 << endl;
|
||||
os << meshPts[e.start()] + 1 << ' '
|
||||
<< meshPts[e.end()] + 1 << nl;
|
||||
}
|
||||
|
||||
|
||||
// Write faces in terms of edges.
|
||||
const labelListList& faceEs = surf.faceEdges();
|
||||
|
||||
@ -406,7 +398,7 @@ void Foam::fileFormats::GTSsurfaceFormat<Face>::write
|
||||
os << fEdges[0] + 1 << ' '
|
||||
<< fEdges[1] + 1 << ' '
|
||||
<< fEdges[2] + 1 << ' '
|
||||
<< zoneIds[facei] << endl;
|
||||
<< zoneIds[facei] << nl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -25,7 +25,8 @@ Class
|
||||
Foam::fileFormats::GTSsurfaceFormat
|
||||
|
||||
Description
|
||||
Provide a means of reading/writing GTS format.
|
||||
Read/write GTS format.
|
||||
|
||||
The output is never sorted by zone and is only written if it consists
|
||||
entirely of triangles.
|
||||
|
||||
@ -49,7 +50,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class GTSsurfaceFormat Declaration
|
||||
Class fileFormats::GTSsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -59,6 +60,10 @@ class GTSsurfaceFormat
|
||||
{
|
||||
// Private Member Functions
|
||||
|
||||
//- Check and raise FatalError if output is not triangulated
|
||||
// Triangulatinng on-the-fly is otherwise too annoying
|
||||
static bool checkIfTriangulated(const UList<Face>& faceLst);
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
GTSsurfaceFormat(const GTSsurfaceFormat<Face>&) = delete;
|
||||
|
||||
@ -71,49 +76,45 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from file name
|
||||
GTSsurfaceFormat(const fileName&);
|
||||
|
||||
|
||||
// Selectors
|
||||
|
||||
//- Read file and return surface
|
||||
static autoPtr<UnsortedMeshedSurface<Face>> New(const fileName& name)
|
||||
{
|
||||
return autoPtr<UnsortedMeshedSurface<Face>>
|
||||
(
|
||||
new GTSsurfaceFormat<Face>(name)
|
||||
);
|
||||
}
|
||||
GTSsurfaceFormat(const fileName& filename);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~GTSsurfaceFormat()
|
||||
{}
|
||||
virtual ~GTSsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
// Static Member Functions
|
||||
|
||||
//- Write MeshedSurface
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurface<Face>&
|
||||
const fileName& filename,
|
||||
const MeshedSurface<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
//- Write UnsortedMeshedSurface, the output remains unsorted
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const UnsortedMeshedSurface<Face>&
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Read from file
|
||||
virtual bool read(const fileName&);
|
||||
virtual bool read(const fileName& filename);
|
||||
|
||||
//- Write object
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, *this);
|
||||
write(name, *this, options);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -24,45 +24,48 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
#include "OFstream.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void triSurface::writeGTS(const bool writeSorted, Ostream& os) const
|
||||
void Foam::triSurface::writeGTS
|
||||
(
|
||||
const fileName& filename,
|
||||
const bool sort
|
||||
) const
|
||||
{
|
||||
OFstream os(filename);
|
||||
if (!os.good())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Cannot open file for writing " << filename
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
// Write header
|
||||
os << "# GTS file" << endl
|
||||
<< "# Regions:" << endl;
|
||||
|
||||
labelList faceMap;
|
||||
|
||||
surfacePatchList patches(calcPatches(faceMap));
|
||||
|
||||
// Print patch names as comment
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
os << "# " << patchi << " "
|
||||
<< patches[patchi].name() << endl;
|
||||
<< patches[patchi].name() << nl;
|
||||
}
|
||||
os << "#" << endl;
|
||||
os << "#" << nl;
|
||||
|
||||
const pointField& pts = points();
|
||||
|
||||
const pointField& ps = points();
|
||||
|
||||
os << "# nPoints nEdges nTriangles" << endl
|
||||
<< ps.size() << ' ' << nEdges() << ' ' << size() << endl;
|
||||
os << "# nPoints nEdges nTriangles" << nl
|
||||
<< pts.size() << ' ' << nEdges() << ' ' << size() << nl;
|
||||
|
||||
// Write vertex coords
|
||||
|
||||
forAll(ps, pointi)
|
||||
for (const point& pt : pts)
|
||||
{
|
||||
os << ps[pointi].x() << ' '
|
||||
<< ps[pointi].y() << ' '
|
||||
<< ps[pointi].z() << endl;
|
||||
os << pt.x() << ' ' << pt.y() << ' ' << pt.z() << nl;
|
||||
}
|
||||
|
||||
// Write edges.
|
||||
@ -70,26 +73,23 @@ void triSurface::writeGTS(const bool writeSorted, Ostream& os) const
|
||||
const edgeList& es = edges();
|
||||
const labelList& meshPts = meshPoints();
|
||||
|
||||
forAll(es, edgei)
|
||||
for (const edge& e : es)
|
||||
{
|
||||
os << meshPts[es[edgei].start()] + 1 << ' '
|
||||
<< meshPts[es[edgei].end()] + 1 << endl;
|
||||
os << meshPts[e.start()] + 1 << ' '
|
||||
<< meshPts[e.end()] + 1 << nl;
|
||||
}
|
||||
|
||||
// Write faces in terms of edges.
|
||||
const labelListList& faceEs = faceEdges();
|
||||
|
||||
if (writeSorted)
|
||||
if (sort)
|
||||
{
|
||||
label faceIndex = 0;
|
||||
forAll(patches, patchi)
|
||||
for (const surfacePatch& p : patches)
|
||||
{
|
||||
for
|
||||
(
|
||||
label patchFacei = 0;
|
||||
patchFacei < patches[patchi].size();
|
||||
patchFacei++
|
||||
)
|
||||
const label nLocalFaces = p.size();
|
||||
|
||||
for (label i = 0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const label facei = faceMap[faceIndex++];
|
||||
|
||||
@ -98,7 +98,7 @@ void triSurface::writeGTS(const bool writeSorted, Ostream& os) const
|
||||
os << fEdges[0] + 1 << ' '
|
||||
<< fEdges[1] + 1 << ' '
|
||||
<< fEdges[2] + 1 << ' '
|
||||
<< (*this)[facei].region() << endl;
|
||||
<< (*this)[facei].region() << nl;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -111,14 +111,10 @@ void triSurface::writeGTS(const bool writeSorted, Ostream& os) const
|
||||
os << fEdges[0] + 1 << ' '
|
||||
<< fEdges[1] + 1 << ' '
|
||||
<< fEdges[2] + 1 << ' '
|
||||
<< (*this)[facei].region() << endl;
|
||||
<< (*this)[facei].region() << nl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -25,9 +25,62 @@ License
|
||||
|
||||
#include "NASsurfaceFormat.H"
|
||||
#include "IFstream.H"
|
||||
#include "StringStream.H"
|
||||
#include "IOmanip.H"
|
||||
#include "faceTraits.H"
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
inline Foam::label Foam::fileFormats::NASsurfaceFormat<Face>::writeShell
|
||||
(
|
||||
Ostream& os,
|
||||
const Face& f,
|
||||
const label groupId,
|
||||
label elementId
|
||||
)
|
||||
{
|
||||
const label n = f.size();
|
||||
|
||||
if (n == 3)
|
||||
{
|
||||
os << "CTRIA3" << ','
|
||||
<< ++elementId << ','
|
||||
<< (groupId + 1) << ','
|
||||
<< (f[0] + 1) << ','
|
||||
<< (f[1] + 1) << ','
|
||||
<< (f[2] + 1) << nl;
|
||||
}
|
||||
else if (n == 4)
|
||||
{
|
||||
os << "CTRIA3" << ','
|
||||
<< ++elementId << ','
|
||||
<< (groupId + 1) << ','
|
||||
<< (f[0] + 1) << ','
|
||||
<< (f[1] + 1) << ','
|
||||
<< (f[2] + 1) << ','
|
||||
<< (f[3] + 1) << nl;
|
||||
}
|
||||
else
|
||||
{
|
||||
// simple triangulation about f[0].
|
||||
// better triangulation should have been done before
|
||||
for (label fp1 = 1; fp1 < f.size() - 1; ++fp1)
|
||||
{
|
||||
const label fp2 = f.fcIndex(fp1);
|
||||
|
||||
os << "CTRIA3" << ','
|
||||
<< ++elementId << ','
|
||||
<< (groupId + 1) << ','
|
||||
<< (f[0] + 1) << ','
|
||||
<< (f[fp1] + 1) << ','
|
||||
<< (f[fp2] + 1) << nl;
|
||||
}
|
||||
}
|
||||
|
||||
return elementId;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
@ -64,7 +117,7 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
DynamicList<Face> dynFaces;
|
||||
DynamicList<label> dynZones;
|
||||
DynamicList<label> dynSizes;
|
||||
Map<label> lookup;
|
||||
Map<label> zoneLookup;
|
||||
|
||||
// assume the types are not intermixed
|
||||
// leave faces that didn't have a group in 0
|
||||
@ -86,10 +139,13 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
|
||||
while (is.good())
|
||||
{
|
||||
string::size_type linei = 0; // parsing position within current line
|
||||
string line;
|
||||
is.getLine(line);
|
||||
|
||||
// ANSA extension
|
||||
// line 1: $ANSA_NAME;<int>;<word>;
|
||||
// line 2: $partName
|
||||
if (line.startsWith("$ANSA_NAME"))
|
||||
{
|
||||
const auto sem0 = line.find(';', 0);
|
||||
@ -98,9 +154,9 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
|
||||
if
|
||||
(
|
||||
sem0 != string::npos
|
||||
&& sem1 != string::npos
|
||||
&& sem2 != string::npos
|
||||
sem0 != std::string::npos
|
||||
&& sem1 != std::string::npos
|
||||
&& sem2 != std::string::npos
|
||||
)
|
||||
{
|
||||
ansaId = readLabel(line.substr(sem0+1, sem1-sem0-1));
|
||||
@ -108,7 +164,7 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
|
||||
string rawName;
|
||||
is.getLine(rawName);
|
||||
rawName.removeEnd("\r");
|
||||
rawName.removeEnd("\r"); // Possible CR-NL
|
||||
ansaName = word::validate(rawName.substr(1));
|
||||
|
||||
// Info<< "ANSA tag for NastranID:" << ansaId
|
||||
@ -118,26 +174,22 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
}
|
||||
|
||||
|
||||
// Hypermesh extension
|
||||
// HYPERMESH extension
|
||||
// $HMNAME COMP 1"partName"
|
||||
if (line.startsWith("$HMNAME COMP") && line.find('"') != string::npos)
|
||||
{
|
||||
label groupId = readLabel(line.substr(16, 16));
|
||||
IStringStream lineStream(line.substr(32));
|
||||
|
||||
string rawName;
|
||||
lineStream >> rawName;
|
||||
// word::validate automatically removes quotes too
|
||||
const word groupName = word::validate(line.substr(32));
|
||||
|
||||
const word groupName = word::validate(rawName);
|
||||
nameLookup.insert(groupId, groupName);
|
||||
// Info<< "group " << groupId << " => " << groupName << endl;
|
||||
}
|
||||
|
||||
|
||||
// Skip empty or comment
|
||||
if (line.empty() || line[0] == '$')
|
||||
{
|
||||
continue;
|
||||
continue; // Skip empty or comment
|
||||
}
|
||||
|
||||
// Check if character 72 is continuation
|
||||
@ -162,22 +214,20 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Read first word
|
||||
IStringStream lineStream(line);
|
||||
word cmd;
|
||||
lineStream >> cmd;
|
||||
// First word (column 0-8)
|
||||
const word cmd(word::validate(nextNasField(line, linei, 8)));
|
||||
|
||||
if (cmd == "CTRIA3")
|
||||
{
|
||||
label groupId = readLabel(line.substr(16,8));
|
||||
label a = readLabel(line.substr(24,8));
|
||||
label b = readLabel(line.substr(32,8));
|
||||
label c = readLabel(line.substr(40,8));
|
||||
(void) nextNasField(line, linei, 8); // 8-16
|
||||
label groupId = readLabel(nextNasField(line, linei, 8)); // 16-24
|
||||
label a = readLabel(nextNasField(line, linei, 8)); // 24-32
|
||||
label b = readLabel(nextNasField(line, linei, 8)); // 32-40
|
||||
label c = readLabel(nextNasField(line, linei, 8)); // 40-48
|
||||
|
||||
// Convert groupID into zoneId
|
||||
Map<label>::const_iterator fnd = lookup.find(groupId);
|
||||
if (fnd != lookup.end())
|
||||
// Convert groupId into zoneId
|
||||
const auto fnd = zoneLookup.cfind(groupId);
|
||||
if (fnd.found())
|
||||
{
|
||||
if (zoneI != fnd())
|
||||
{
|
||||
@ -189,7 +239,7 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
else
|
||||
{
|
||||
zoneI = dynSizes.size();
|
||||
lookup.insert(groupId, zoneI);
|
||||
zoneLookup.insert(groupId, zoneI);
|
||||
dynSizes.append(0);
|
||||
// Info<< "zone" << zoneI << " => group " << groupId <<endl;
|
||||
}
|
||||
@ -200,15 +250,16 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
}
|
||||
else if (cmd == "CQUAD4")
|
||||
{
|
||||
label groupId = readLabel(line.substr(16,8));
|
||||
label a = readLabel(line.substr(24,8));
|
||||
label b = readLabel(line.substr(32,8));
|
||||
label c = readLabel(line.substr(40,8));
|
||||
label d = readLabel(line.substr(48,8));
|
||||
(void) nextNasField(line, linei, 8); // 8-16
|
||||
label groupId = readLabel(nextNasField(line, linei, 8)); // 16-24
|
||||
label a = readLabel(nextNasField(line, linei, 8)); // 24-32
|
||||
label b = readLabel(nextNasField(line, linei, 8)); // 32-40
|
||||
label c = readLabel(nextNasField(line, linei, 8)); // 40-48
|
||||
label d = readLabel(nextNasField(line, linei, 8)); // 48-56
|
||||
|
||||
// Convert groupID into zoneId
|
||||
Map<label>::const_iterator fnd = lookup.find(groupId);
|
||||
if (fnd != lookup.end())
|
||||
const auto fnd = zoneLookup.cfind(groupId);
|
||||
if (fnd.found())
|
||||
{
|
||||
if (zoneI != fnd())
|
||||
{
|
||||
@ -220,7 +271,7 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
else
|
||||
{
|
||||
zoneI = dynSizes.size();
|
||||
lookup.insert(groupId, zoneI);
|
||||
zoneLookup.insert(groupId, zoneI);
|
||||
dynSizes.append(0);
|
||||
// Info<< "zone" << zoneI << " => group " << groupId <<endl;
|
||||
}
|
||||
@ -242,10 +293,11 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
}
|
||||
else if (cmd == "GRID")
|
||||
{
|
||||
label index = readLabel(line.substr(8,8));
|
||||
scalar x = readNasScalar(line.substr(24, 8));
|
||||
scalar y = readNasScalar(line.substr(32, 8));
|
||||
scalar z = readNasScalar(line.substr(40, 8));
|
||||
label index = readLabel(nextNasField(line, linei, 8)); // 8-16
|
||||
(void) nextNasField(line, linei, 8); // 16-24
|
||||
scalar x = readNasScalar(nextNasField(line, linei, 8)); // 24-32
|
||||
scalar y = readNasScalar(nextNasField(line, linei, 8)); // 32-40
|
||||
scalar z = readNasScalar(nextNasField(line, linei, 8)); // 40-48
|
||||
|
||||
pointId.append(index);
|
||||
dynPoints.append(point(x, y, z));
|
||||
@ -258,10 +310,12 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
// GRID* 126 0 -5.55999875E+02 -5.68730474E+02
|
||||
// * 2.14897901E+02
|
||||
|
||||
label index = readLabel(line.substr(8,16));
|
||||
scalar x = readNasScalar(line.substr(40, 16));
|
||||
scalar y = readNasScalar(line.substr(56, 16));
|
||||
label index = readLabel(nextNasField(line, linei, 16)); // 8-24
|
||||
(void) nextNasField(line, linei, 16); // 24-40
|
||||
scalar x = readNasScalar(nextNasField(line, linei, 16)); // 40-56
|
||||
scalar y = readNasScalar(nextNasField(line, linei, 16)); // 56-72
|
||||
|
||||
linei = 0; // restart at index 0
|
||||
is.getLine(line);
|
||||
if (line[0] != '*')
|
||||
{
|
||||
@ -272,20 +326,21 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
<< "File:" << is.name() << " line:" << is.lineNumber()
|
||||
<< exit(FatalError);
|
||||
}
|
||||
scalar z = readNasScalar(line.substr(8, 16));
|
||||
(void) nextNasField(line, linei, 8); // 0-8
|
||||
scalar z = readNasScalar(nextNasField(line, linei, 16)); // 8-16
|
||||
|
||||
pointId.append(index);
|
||||
dynPoints.append(point(x, y, z));
|
||||
}
|
||||
else if (cmd == "PSHELL")
|
||||
{
|
||||
// pshell type for zone names with the Ansa extension
|
||||
label groupId = readLabel(line.substr(8,8));
|
||||
|
||||
// Read shell type since group gives patchnames (ANSA extension)
|
||||
label groupId = readLabel(nextNasField(line, linei, 8)); // 8-16
|
||||
if (groupId == ansaId && ansaType == "PSHELL")
|
||||
{
|
||||
nameLookup.insert(ansaId, ansaName);
|
||||
// Info<< "group " << groupId << " => " << ansaName << endl;
|
||||
const word groupName = word::validate(ansaName);
|
||||
nameLookup.insert(groupId, groupName);
|
||||
// Info<< "group " << groupId << " => " << groupName << endl;
|
||||
}
|
||||
}
|
||||
else if (unhandledCmd.insert(cmd))
|
||||
@ -315,9 +370,8 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
|
||||
// Relabel faces
|
||||
// ~~~~~~~~~~~~~
|
||||
forAll(dynFaces, i)
|
||||
for (Face& f : dynFaces)
|
||||
{
|
||||
Face& f = dynFaces[i];
|
||||
forAll(f, fp)
|
||||
{
|
||||
f[fp] = mapPointId[f[fp]];
|
||||
@ -329,19 +383,19 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
|
||||
// create default zone names, or from ANSA/Hypermesh information
|
||||
List<word> names(dynSizes.size());
|
||||
forAllConstIter(Map<label>, lookup, iter)
|
||||
forAllConstIters(zoneLookup, iter)
|
||||
{
|
||||
const label zoneI = iter();
|
||||
const label groupI = iter.key();
|
||||
const label groupId = iter.key();
|
||||
const label zoneId = iter.object();
|
||||
|
||||
Map<word>::const_iterator fnd = nameLookup.find(groupI);
|
||||
if (fnd != nameLookup.end())
|
||||
const auto fnd = nameLookup.cfind(groupId);
|
||||
if (fnd.found())
|
||||
{
|
||||
names[zoneI] = fnd();
|
||||
names[zoneId] = fnd();
|
||||
}
|
||||
else
|
||||
{
|
||||
names[zoneI] = word("zone") + ::Foam::name(zoneI);
|
||||
names[zoneId] = word("zone") + ::Foam::name(zoneId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -353,4 +407,94 @@ bool Foam::fileFormats::NASsurfaceFormat<Face>::read
|
||||
}
|
||||
|
||||
|
||||
template<class Face>
|
||||
void Foam::fileFormats::NASsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& faceMap = surf.faceMap();
|
||||
|
||||
// for no zones, suppress the group name
|
||||
const UList<surfZone>& zones =
|
||||
(
|
||||
surf.surfZones().empty()
|
||||
? surfaceFormatsCore::oneZone(faceLst, "")
|
||||
: surf.surfZones()
|
||||
);
|
||||
|
||||
const bool useFaceMap = (surf.useFaceMap() && zones.size() > 1);
|
||||
|
||||
OFstream os(filename);
|
||||
if (!os.good())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Cannot open file for writing " << filename
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
// For simplicity, use fieldFormat::FREE throughout
|
||||
fileFormats::NASCore::setPrecision(os, fieldFormat::FREE);
|
||||
|
||||
os << "CEND" << nl
|
||||
<< "TITLE = " << os.name().nameLessExt() << nl;
|
||||
|
||||
// Print zone names as comment
|
||||
forAll(zones, zonei)
|
||||
{
|
||||
// HYPERMESH extension
|
||||
os << "$HMNAME COMP" << setw(20) << (zonei+1)
|
||||
<< '"' << zones[zonei].name() << '"' << nl;
|
||||
}
|
||||
|
||||
// Write vertex coords with 1-based point Id
|
||||
os << "$ GRID POINTS" << nl
|
||||
<< "BEGIN BULK" << nl;
|
||||
|
||||
label pointId = 0;
|
||||
for (const point& pt : pointLst)
|
||||
{
|
||||
os << "GRID" << ','
|
||||
<< ++pointId << ','
|
||||
<< 0 << ',' // global coordinate system
|
||||
<< pt.x() << ',' << pt.y() << ',' << pt.z() << nl;
|
||||
}
|
||||
|
||||
os << "$ ELEMENTS" << nl;
|
||||
|
||||
label faceIndex = 0;
|
||||
label zoneIndex = 0;
|
||||
label elementId = 0;
|
||||
for (const surfZone& zone : zones)
|
||||
{
|
||||
const label nLocalFaces = zone.size();
|
||||
|
||||
if (useFaceMap)
|
||||
{
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceMap[faceIndex++]];
|
||||
elementId = writeShell(os, f, zoneIndex, elementId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceIndex++];
|
||||
elementId = writeShell(os, f, zoneIndex, elementId);
|
||||
}
|
||||
}
|
||||
|
||||
++zoneIndex;
|
||||
}
|
||||
|
||||
os << "ENDDATA" << nl;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -29,7 +29,7 @@ Description
|
||||
|
||||
- Uses the Ansa "$ANSA_NAME" or the Hypermesh "$HMNAME COMP" extensions
|
||||
to obtain zone names.
|
||||
- Handles Nastran short and long formats, but not free format.
|
||||
- Handles Nastran short, long formats and comma-separated free format.
|
||||
- Properly handles the Nastran compact floating point notation: \n
|
||||
\verbatim
|
||||
GRID 28 10.20269-.030265-2.358-8
|
||||
@ -56,7 +56,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class NASsurfaceFormat Declaration
|
||||
Class fileFormats::NASsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -67,6 +67,15 @@ class NASsurfaceFormat
|
||||
{
|
||||
// Private Member Functions
|
||||
|
||||
//- Output CTRIA3 or CQUAD4
|
||||
inline static label writeShell
|
||||
(
|
||||
Ostream& os,
|
||||
const Face& f,
|
||||
const label groupId,
|
||||
label elementId
|
||||
);
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
NASsurfaceFormat(const NASsurfaceFormat<Face>&) = delete;
|
||||
|
||||
@ -79,30 +88,38 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from file name
|
||||
NASsurfaceFormat(const fileName&);
|
||||
|
||||
|
||||
// Selectors
|
||||
|
||||
//- Read file and return surface
|
||||
static autoPtr<MeshedSurface<Face>> New(const fileName& name)
|
||||
{
|
||||
return autoPtr<MeshedSurface<Face>>
|
||||
(
|
||||
new NASsurfaceFormat<Face>(name)
|
||||
);
|
||||
}
|
||||
NASsurfaceFormat(const fileName& filename);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~NASsurfaceFormat()
|
||||
{}
|
||||
virtual ~NASsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Read from a file
|
||||
virtual bool read(const fileName&);
|
||||
virtual bool read(const fileName& filename);
|
||||
|
||||
//- Write object file
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -87,6 +87,36 @@ addNamedTemplatedToRunTimeSelectionTable
|
||||
nas
|
||||
);
|
||||
|
||||
|
||||
// write MeshedSurfaceProxy
|
||||
addNamedTemplatedToMemberFunctionSelectionTable
|
||||
(
|
||||
MeshedSurfaceProxy,
|
||||
NASsurfaceFormat,
|
||||
face,
|
||||
write,
|
||||
fileExtension,
|
||||
nas
|
||||
);
|
||||
addNamedTemplatedToMemberFunctionSelectionTable
|
||||
(
|
||||
MeshedSurfaceProxy,
|
||||
NASsurfaceFormat,
|
||||
triFace,
|
||||
write,
|
||||
fileExtension,
|
||||
nas
|
||||
);
|
||||
addNamedTemplatedToMemberFunctionSelectionTable
|
||||
(
|
||||
MeshedSurfaceProxy,
|
||||
NASsurfaceFormat,
|
||||
labelledTri,
|
||||
write,
|
||||
fileExtension,
|
||||
nas
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -72,12 +72,6 @@ Foam::OBJstream::OBJstream
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::OBJstream::~OBJstream()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
Foam::Ostream& Foam::OBJstream::write(const char c)
|
||||
|
||||
@ -87,10 +87,10 @@ public:
|
||||
|
||||
|
||||
//- Destructor
|
||||
~OBJstream();
|
||||
~OBJstream() = default;
|
||||
|
||||
|
||||
// Member functions
|
||||
// Member Functions
|
||||
|
||||
// Access
|
||||
|
||||
|
||||
@ -146,7 +146,7 @@ bool Foam::fileFormats::OBJsurfaceFormat<Face>::read
|
||||
}
|
||||
else
|
||||
{
|
||||
vertexSpec = line.substr(startNum, line.size() - startNum);
|
||||
vertexSpec = line.substr(startNum);
|
||||
}
|
||||
|
||||
string::size_type slashPos = vertexSpec.find('/');
|
||||
@ -176,7 +176,7 @@ bool Foam::fileFormats::OBJsurfaceFormat<Face>::read
|
||||
// points may be incomplete
|
||||
for (label fp1 = 1; fp1 < f.size() - 1; fp1++)
|
||||
{
|
||||
label fp2 = f.fcIndex(fp1);
|
||||
const label fp2 = f.fcIndex(fp1);
|
||||
|
||||
dynFaces.append(Face{f[0], f[fp1], f[fp2]});
|
||||
dynZones.append(zoneI);
|
||||
@ -208,15 +208,16 @@ template<class Face>
|
||||
void Foam::fileFormats::OBJsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& faceMap = surf.faceMap();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& faceMap = surf.faceMap();
|
||||
|
||||
// for no zones, suppress the group name
|
||||
const List<surfZone>& zones =
|
||||
const UList<surfZone>& zones =
|
||||
(
|
||||
surf.surfZones().empty()
|
||||
? surfaceFormatsCore::oneZone(faceLst, "")
|
||||
@ -242,41 +243,39 @@ void Foam::fileFormats::OBJsurfaceFormat<Face>::write
|
||||
<< "# zones : " << zones.size() << nl;
|
||||
|
||||
// Print zone names as comment
|
||||
forAll(zones, zoneI)
|
||||
forAll(zones, zonei)
|
||||
{
|
||||
os << "# " << zoneI << " " << zones[zoneI].name()
|
||||
<< " (nFaces: " << zones[zoneI].size() << ")" << nl;
|
||||
os << "# " << zonei << " " << zones[zonei].name()
|
||||
<< " (nFaces: " << zones[zonei].size() << ")" << nl;
|
||||
}
|
||||
|
||||
os << nl
|
||||
<< "# <points count=\"" << pointLst.size() << "\">" << nl;
|
||||
|
||||
// Write vertex coords
|
||||
forAll(pointLst, ptI)
|
||||
for (const point& pt : pointLst)
|
||||
{
|
||||
const point& pt = pointLst[ptI];
|
||||
|
||||
os << "v " << pt.x() << ' ' << pt.y() << ' ' << pt.z() << nl;
|
||||
}
|
||||
|
||||
os << "# </points>" << nl
|
||||
<< nl
|
||||
<< "# <faces count=\"" << faceLst.size() << "\">" << endl;
|
||||
<< "# <faces count=\"" << faceLst.size() << "\">" << nl;
|
||||
|
||||
|
||||
label faceIndex = 0;
|
||||
forAll(zones, zoneI)
|
||||
for (const surfZone& zone : zones)
|
||||
{
|
||||
const surfZone& zone = zones[zoneI];
|
||||
|
||||
if (zone.name().size())
|
||||
{
|
||||
os << "g " << zone.name() << endl;
|
||||
os << "g " << zone.name() << nl;
|
||||
}
|
||||
|
||||
const label nLocalFaces = zone.size();
|
||||
|
||||
if (useFaceMap)
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceMap[faceIndex++]];
|
||||
|
||||
@ -285,12 +284,12 @@ void Foam::fileFormats::OBJsurfaceFormat<Face>::write
|
||||
{
|
||||
os << ' ' << f[fp] + 1;
|
||||
}
|
||||
os << endl;
|
||||
os << nl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceIndex++];
|
||||
|
||||
@ -299,11 +298,11 @@ void Foam::fileFormats::OBJsurfaceFormat<Face>::write
|
||||
{
|
||||
os << ' ' << f[fp] + 1;
|
||||
}
|
||||
os << endl;
|
||||
os << nl;
|
||||
}
|
||||
}
|
||||
}
|
||||
os << "# </faces>" << endl;
|
||||
os << "# </faces>" << nl;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -25,7 +25,7 @@ Class
|
||||
Foam::fileFormats::OBJsurfaceFormat
|
||||
|
||||
Description
|
||||
Provide a means of reading/writing Alias/Wavefront OBJ format.
|
||||
Read/write Alias/Wavefront OBJ format.
|
||||
|
||||
Does not handle negative face indices.
|
||||
|
||||
@ -49,7 +49,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class OBJsurfaceFormat Declaration
|
||||
Class fileFormats::OBJsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -71,42 +71,37 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from file name
|
||||
OBJsurfaceFormat(const fileName&);
|
||||
|
||||
|
||||
// Selectors
|
||||
|
||||
//- Read file and return surface
|
||||
static autoPtr<MeshedSurface<Face>> New(const fileName& name)
|
||||
{
|
||||
return autoPtr<MeshedSurface<Face>>
|
||||
(
|
||||
new OBJsurfaceFormat<Face>(name)
|
||||
);
|
||||
}
|
||||
OBJsurfaceFormat(const fileName& filename);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~OBJsurfaceFormat()
|
||||
{}
|
||||
virtual ~OBJsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Read from file
|
||||
virtual bool read(const fileName&);
|
||||
virtual bool read(const fileName& filename);
|
||||
|
||||
//- Write object file
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this));
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -143,13 +143,14 @@ template<class Face>
|
||||
void Foam::fileFormats::OFFsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary&
|
||||
)
|
||||
{
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& faceMap = surf.faceMap();
|
||||
const List<surfZone>& zoneLst = surf.surfZones();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& faceMap = surf.faceMap();
|
||||
const UList<surfZone>& zoneLst = surf.surfZones();
|
||||
|
||||
OFstream os(filename);
|
||||
if (!os.good())
|
||||
@ -197,16 +198,18 @@ void Foam::fileFormats::OFFsurfaceFormat<Face>::write
|
||||
{
|
||||
os << "# <zone name=\"" << zoneLst[zoneI].name() << "\">" << endl;
|
||||
|
||||
const label nLocalFaces = zoneLst[zoneI].size();
|
||||
|
||||
if (surf.useFaceMap())
|
||||
{
|
||||
forAll(zoneLst[zoneI], localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceMap[faceIndex++]];
|
||||
|
||||
os << f.size();
|
||||
forAll(f, fp)
|
||||
for (const label verti : f)
|
||||
{
|
||||
os << ' ' << f[fp];
|
||||
os << ' ' << verti;
|
||||
}
|
||||
|
||||
// add optional zone information
|
||||
@ -215,14 +218,14 @@ void Foam::fileFormats::OFFsurfaceFormat<Face>::write
|
||||
}
|
||||
else
|
||||
{
|
||||
forAll(zoneLst[zoneI], localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceIndex++];
|
||||
|
||||
os << f.size();
|
||||
forAll(f, fp)
|
||||
for (const label verti : f)
|
||||
{
|
||||
os << ' ' << f[fp];
|
||||
os << ' ' << verti;
|
||||
}
|
||||
|
||||
// add optional zone information
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -25,8 +25,7 @@ Class
|
||||
Foam::fileFormats::OFFsurfaceFormat
|
||||
|
||||
Description
|
||||
Provide a means of reading/writing Geomview OFF polyList format.
|
||||
|
||||
Read/write Geomview OFF polyList format.
|
||||
|
||||
See also
|
||||
The <a href="http://www.geoview.org">Geoview</a>
|
||||
@ -57,7 +56,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class OFFsurfaceFormat Declaration
|
||||
Class fileFormats::OFFsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -79,42 +78,37 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from file name
|
||||
OFFsurfaceFormat(const fileName&);
|
||||
|
||||
|
||||
// Selectors
|
||||
|
||||
//- Read file and return surface
|
||||
static autoPtr<MeshedSurface<Face>> New(const fileName& name)
|
||||
{
|
||||
return autoPtr<MeshedSurface<Face>>
|
||||
(
|
||||
new OFFsurfaceFormat(name)
|
||||
);
|
||||
}
|
||||
OFFsurfaceFormat(const fileName& filename);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~OFFsurfaceFormat()
|
||||
{}
|
||||
virtual ~OFFsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Read from file
|
||||
virtual bool read(const fileName&);
|
||||
virtual bool read(const fileName& filename);
|
||||
|
||||
//- Write object
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this));
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -27,27 +27,21 @@ License
|
||||
#include "clock.H"
|
||||
#include "OFstream.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
Foam::fileFormats::SMESHsurfaceFormat<Face>::SMESHsurfaceFormat()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
void Foam::fileFormats::SMESHsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary&
|
||||
)
|
||||
{
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& faceMap = surf.faceMap();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& faceMap = surf.faceMap();
|
||||
|
||||
const List<surfZone>& zones =
|
||||
const UList<surfZone>& zones =
|
||||
(
|
||||
surf.surfZones().empty()
|
||||
? surfaceFormatsCore::oneZone(faceLst)
|
||||
@ -71,11 +65,11 @@ void Foam::fileFormats::SMESHsurfaceFormat<Face>::write
|
||||
<< pointLst.size() << " 3" << nl; // 3: dimensions
|
||||
|
||||
// Write vertex coords
|
||||
forAll(pointLst, ptI)
|
||||
forAll(pointLst, pti)
|
||||
{
|
||||
const point& pt = pointLst[ptI];
|
||||
const point& pt = pointLst[pti];
|
||||
|
||||
os << ptI << ' ' << pt.x() << ' ' << pt.y() << ' ' << pt.z() << nl;
|
||||
os << pti << ' ' << pt.x() << ' ' << pt.y() << ' ' << pt.z() << nl;
|
||||
}
|
||||
os << "# </points>" << nl
|
||||
<< nl
|
||||
@ -85,38 +79,41 @@ void Foam::fileFormats::SMESHsurfaceFormat<Face>::write
|
||||
|
||||
|
||||
label faceIndex = 0;
|
||||
forAll(zones, zoneI)
|
||||
label zoneIndex = 0;
|
||||
for (const surfZone& zone : zones)
|
||||
{
|
||||
const surfZone& zone = zones[zoneI];
|
||||
const label nLocalFaces = zone.size();
|
||||
|
||||
if (useFaceMap)
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceMap[faceIndex++]];
|
||||
|
||||
os << f.size();
|
||||
forAll(f, fp)
|
||||
for (const label verti : f)
|
||||
{
|
||||
os << ' ' << f[fp];
|
||||
os << ' ' << verti;
|
||||
}
|
||||
os << ' ' << zoneI << endl;
|
||||
os << ' ' << zoneIndex << nl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
forAll(zones[zoneI], localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceIndex++];
|
||||
|
||||
os << f.size();
|
||||
forAll(f, fp)
|
||||
for (const label verti : f)
|
||||
{
|
||||
os << ' ' << f[fp];
|
||||
os << ' ' << verti;
|
||||
}
|
||||
os << ' ' << zoneI << endl;
|
||||
os << ' ' << zoneIndex << nl;
|
||||
}
|
||||
}
|
||||
|
||||
++zoneIndex;
|
||||
}
|
||||
|
||||
// write tail
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -25,7 +25,7 @@ Class
|
||||
Foam::fileFormats::SMESHsurfaceFormat
|
||||
|
||||
Description
|
||||
Provide a means of writing tetgen SMESH format.
|
||||
Write tetgen SMESH format.
|
||||
|
||||
Tetgen http://tetgen.berlios.de
|
||||
|
||||
@ -53,7 +53,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class SMESHsurfaceFormat Declaration
|
||||
Class fileFormats::SMESHsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -75,27 +75,34 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
SMESHsurfaceFormat();
|
||||
SMESHsurfaceFormat() = default;
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~SMESHsurfaceFormat()
|
||||
{}
|
||||
virtual ~SMESHsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Write object
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this));
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -47,16 +47,16 @@ inline void Foam::fileFormats::STARCDsurfaceFormat<Face>::writeShell
|
||||
// primitives have <= 8 vertices, but prevent overrun anyhow
|
||||
// indent following lines for ease of reading
|
||||
label count = 0;
|
||||
forAll(f, fp)
|
||||
for (const label verti : f)
|
||||
{
|
||||
if ((count % 8) == 0)
|
||||
{
|
||||
os << nl << " " << cellId;
|
||||
}
|
||||
os << ' ' << f[fp] + 1;
|
||||
count++;
|
||||
os << ' ' << verti + 1;
|
||||
++count;
|
||||
}
|
||||
os << endl;
|
||||
os << nl;
|
||||
}
|
||||
|
||||
|
||||
@ -160,8 +160,8 @@ bool Foam::fileFormats::STARCDsurfaceFormat<Face>::read
|
||||
if (typeId == starcdShellType)
|
||||
{
|
||||
// Convert groupID into zoneID
|
||||
Map<label>::const_iterator fnd = lookup.find(cellTableId);
|
||||
if (fnd != lookup.end())
|
||||
const auto fnd = lookup.cfind(cellTableId);
|
||||
if (fnd.found())
|
||||
{
|
||||
if (zoneI != fnd())
|
||||
{
|
||||
@ -175,20 +175,19 @@ bool Foam::fileFormats::STARCDsurfaceFormat<Face>::read
|
||||
zoneI = dynSizes.size();
|
||||
lookup.insert(cellTableId, zoneI);
|
||||
|
||||
Map<word>::const_iterator tableNameIter =
|
||||
cellTableLookup.find(cellTableId);
|
||||
const auto tableNameIter = cellTableLookup.cfind(cellTableId);
|
||||
|
||||
if (tableNameIter == cellTableLookup.end())
|
||||
if (tableNameIter.found())
|
||||
{
|
||||
dynNames.append(tableNameIter());
|
||||
}
|
||||
else
|
||||
{
|
||||
dynNames.append
|
||||
(
|
||||
word("cellTable_") + ::Foam::name(cellTableId)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
dynNames.append(tableNameIter());
|
||||
}
|
||||
|
||||
dynSizes.append(0);
|
||||
}
|
||||
@ -203,10 +202,10 @@ bool Foam::fileFormats::STARCDsurfaceFormat<Face>::read
|
||||
label nTri = 0;
|
||||
f.triangles(this->points(), nTri, trias);
|
||||
|
||||
forAll(trias, facei)
|
||||
for (const face& tri : trias)
|
||||
{
|
||||
// a triangular 'face', convert to 'triFace' etc
|
||||
dynFaces.append(Face(trias[facei]));
|
||||
dynFaces.append(Face(tri));
|
||||
dynZones.append(zoneI);
|
||||
dynSizes[zoneI]++;
|
||||
}
|
||||
@ -234,14 +233,15 @@ template<class Face>
|
||||
void Foam::fileFormats::STARCDsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary&
|
||||
)
|
||||
{
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& faceMap = surf.faceMap();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& faceMap = surf.faceMap();
|
||||
|
||||
const List<surfZone>& zones =
|
||||
const UList<surfZone>& zones =
|
||||
(
|
||||
surf.surfZones().empty()
|
||||
? surfaceFormatsCore::oneZone(faceLst)
|
||||
@ -250,7 +250,6 @@ void Foam::fileFormats::STARCDsurfaceFormat<Face>::write
|
||||
|
||||
const bool useFaceMap = (surf.useFaceMap() && zones.size() > 1);
|
||||
|
||||
|
||||
fileName baseName = filename.lessExt();
|
||||
|
||||
writePoints
|
||||
@ -265,10 +264,11 @@ void Foam::fileFormats::STARCDsurfaceFormat<Face>::write
|
||||
forAll(zones, zoneI)
|
||||
{
|
||||
const surfZone& zone = zones[zoneI];
|
||||
const label nLocalFaces = zone.size();
|
||||
|
||||
if (useFaceMap)
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceMap[faceIndex++]];
|
||||
writeShell(os, f, faceIndex, zoneI + 1);
|
||||
@ -276,7 +276,7 @@ void Foam::fileFormats::STARCDsurfaceFormat<Face>::write
|
||||
}
|
||||
else
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceIndex++];
|
||||
writeShell(os, f, faceIndex, zoneI + 1);
|
||||
@ -284,7 +284,7 @@ void Foam::fileFormats::STARCDsurfaceFormat<Face>::write
|
||||
}
|
||||
}
|
||||
|
||||
// write simple .inp file
|
||||
// Write simple .inp file
|
||||
writeCase
|
||||
(
|
||||
OFstream(starFileName(baseName, STARCDCore::INP_FILE))(),
|
||||
|
||||
@ -54,7 +54,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class STARCDsurfaceFormat Declaration
|
||||
Class fileFormats::STARCDsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -67,8 +67,8 @@ class STARCDsurfaceFormat
|
||||
|
||||
static inline void writeShell
|
||||
(
|
||||
Ostream&,
|
||||
const Face&,
|
||||
Ostream& os,
|
||||
const Face& f,
|
||||
const label cellId,
|
||||
const label cellTableId
|
||||
);
|
||||
@ -85,42 +85,37 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from file name
|
||||
STARCDsurfaceFormat(const fileName&);
|
||||
|
||||
|
||||
// Selectors
|
||||
|
||||
//- Read file and return surface
|
||||
static autoPtr<MeshedSurface<Face>> New(const fileName& name)
|
||||
{
|
||||
return autoPtr<MeshedSurface<Face>>
|
||||
(
|
||||
new STARCDsurfaceFormat<Face>(name)
|
||||
);
|
||||
}
|
||||
STARCDsurfaceFormat(const fileName& filename);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~STARCDsurfaceFormat()
|
||||
{}
|
||||
virtual ~STARCDsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Read from file
|
||||
virtual bool read(const fileName&);
|
||||
virtual bool read(const fileName& filename);
|
||||
|
||||
//- Write object
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this));
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -37,7 +37,7 @@ License
|
||||
Foam::Map<Foam::word>
|
||||
Foam::fileFormats::STARCDsurfaceFormatCore::readInpCellTable
|
||||
(
|
||||
IFstream& is
|
||||
ISstream& is
|
||||
)
|
||||
{
|
||||
Map<word> lookup;
|
||||
@ -80,7 +80,7 @@ Foam::fileFormats::STARCDsurfaceFormatCore::readInpCellTable
|
||||
void Foam::fileFormats::STARCDsurfaceFormatCore::writeCase
|
||||
(
|
||||
Ostream& os,
|
||||
const pointField& pointLst,
|
||||
const UList<point>& pts,
|
||||
const label nFaces,
|
||||
const UList<surfZone>& zoneLst
|
||||
)
|
||||
@ -88,7 +88,7 @@ void Foam::fileFormats::STARCDsurfaceFormatCore::writeCase
|
||||
const word caseName = os.name().nameLessExt();
|
||||
|
||||
os << "! STAR-CD file written " << clock::dateTime().c_str() << nl
|
||||
<< "! " << pointLst.size() << " points, " << nFaces << " faces" << nl
|
||||
<< "! " << pts.size() << " points, " << nFaces << " faces" << nl
|
||||
<< "! case " << caseName << nl
|
||||
<< "! ------------------------------" << nl;
|
||||
|
||||
|
||||
@ -48,7 +48,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class STARCDsurfaceFormatCore Declaration
|
||||
Class fileFormats::STARCDsurfaceFormatCore Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class STARCDsurfaceFormatCore
|
||||
@ -57,16 +57,16 @@ class STARCDsurfaceFormatCore
|
||||
{
|
||||
protected:
|
||||
|
||||
// Protected Member Functions
|
||||
// Protected Static Member Functions
|
||||
|
||||
static Map<word> readInpCellTable(IFstream&);
|
||||
static Map<word> readInpCellTable(ISstream& is);
|
||||
|
||||
static void writeCase
|
||||
(
|
||||
Ostream&,
|
||||
const pointField&,
|
||||
Ostream& os,
|
||||
const UList<point>& pts,
|
||||
const label nFaces,
|
||||
const UList<surfZone>&
|
||||
const UList<surfZone>& zoneLst
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@ -25,6 +25,7 @@ License
|
||||
|
||||
#include "STLsurfaceFormat.H"
|
||||
#include "triPointRef.H"
|
||||
#include "ListOps.H"
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
@ -32,22 +33,18 @@ template<class Face>
|
||||
inline void Foam::fileFormats::STLsurfaceFormat<Face>::writeShell
|
||||
(
|
||||
Ostream& os,
|
||||
const pointField& pointLst,
|
||||
const UList<point>& pts,
|
||||
const Face& f
|
||||
)
|
||||
{
|
||||
// calculate the normal ourselves, for flexibility and speed
|
||||
vector norm = triPointRef
|
||||
(
|
||||
pointLst[f[0]],
|
||||
pointLst[f[1]],
|
||||
pointLst[f[2]]
|
||||
).normal();
|
||||
vector norm = triPointRef(pts[f[0]], pts[f[1]], pts[f[2]]).normal();
|
||||
norm /= mag(norm) + VSMALL;
|
||||
|
||||
// simple triangulation about f[0].
|
||||
// better triangulation should have been done before
|
||||
const point& p0 = pointLst[f[0]];
|
||||
const point& p0 = pts[f[0]];
|
||||
|
||||
for (label fp1 = 1; fp1 < f.size() - 1; ++fp1)
|
||||
{
|
||||
const label fp2 = f.fcIndex(fp1);
|
||||
@ -58,8 +55,8 @@ inline void Foam::fileFormats::STLsurfaceFormat<Face>::writeShell
|
||||
os,
|
||||
norm,
|
||||
p0,
|
||||
pointLst[f[fp1]],
|
||||
pointLst[f[fp2]]
|
||||
pts[f[fp1]],
|
||||
pts[f[fp2]]
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -69,23 +66,19 @@ template<class Face>
|
||||
inline void Foam::fileFormats::STLsurfaceFormat<Face>::writeShell
|
||||
(
|
||||
ostream& os,
|
||||
const pointField& pointLst,
|
||||
const UList<point>& pts,
|
||||
const Face& f,
|
||||
const label zoneI
|
||||
)
|
||||
{
|
||||
// calculate the normal ourselves, for flexibility and speed
|
||||
vector norm = triPointRef
|
||||
(
|
||||
pointLst[f[0]],
|
||||
pointLst[f[1]],
|
||||
pointLst[f[2]]
|
||||
).normal();
|
||||
vector norm = triPointRef(pts[f[0]], pts[f[1]], pts[f[2]]).normal();
|
||||
norm /= mag(norm) + VSMALL;
|
||||
|
||||
// simple triangulation about f[0].
|
||||
// better triangulation should have been done before
|
||||
const point& p0 = pointLst[f[0]];
|
||||
const point& p0 = pts[f[0]];
|
||||
|
||||
for (label fp1 = 1; fp1 < f.size() - 1; ++fp1)
|
||||
{
|
||||
const label fp2 = f.fcIndex(fp1);
|
||||
@ -95,8 +88,8 @@ inline void Foam::fileFormats::STLsurfaceFormat<Face>::writeShell
|
||||
(
|
||||
norm,
|
||||
p0,
|
||||
pointLst[f[fp1]],
|
||||
pointLst[f[fp2]],
|
||||
pts[f[fp1]],
|
||||
pts[f[fp2]],
|
||||
zoneI
|
||||
).write(os);
|
||||
}
|
||||
@ -148,7 +141,7 @@ bool Foam::fileFormats::STLsurfaceFormat<Face>::read
|
||||
List<label> sizes(reader.sizes().xfer());
|
||||
List<label> zoneIds(reader.zoneIds().xfer());
|
||||
|
||||
// generate the (sorted) faces
|
||||
// Generate the (sorted) faces
|
||||
List<Face> faceLst(zoneIds.size());
|
||||
|
||||
if (reader.sorted())
|
||||
@ -167,12 +160,12 @@ bool Foam::fileFormats::STLsurfaceFormat<Face>::read
|
||||
}
|
||||
else
|
||||
{
|
||||
// Unsorted - determine the sorted order:
|
||||
// avoid SortableList since we discard the main list anyhow
|
||||
List<label> faceMap;
|
||||
// Determine the sorted order:
|
||||
// use sortedOrder directly (the intermediate list is discared anyhow)
|
||||
labelList faceMap;
|
||||
sortedOrder(zoneIds, faceMap);
|
||||
|
||||
// generate sorted faces
|
||||
// Generate sorted faces
|
||||
forAll(faceMap, facei)
|
||||
{
|
||||
const label startPt = 3*faceMap[facei];
|
||||
@ -186,7 +179,7 @@ bool Foam::fileFormats::STLsurfaceFormat<Face>::read
|
||||
}
|
||||
zoneIds.clear();
|
||||
|
||||
// transfer:
|
||||
// Transfer:
|
||||
this->storedFaces().transfer(faceLst);
|
||||
|
||||
if (names.size())
|
||||
@ -218,11 +211,11 @@ void Foam::fileFormats::STLsurfaceFormat<Face>::writeAscii
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& faceMap = surf.faceMap();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& faceMap = surf.faceMap();
|
||||
|
||||
const List<surfZone>& zones =
|
||||
const UList<surfZone>& zones =
|
||||
(
|
||||
surf.surfZones().empty()
|
||||
? surfaceFormatsCore::oneZone(faceLst)
|
||||
@ -232,24 +225,22 @@ void Foam::fileFormats::STLsurfaceFormat<Face>::writeAscii
|
||||
const bool useFaceMap = (surf.useFaceMap() && zones.size() > 1);
|
||||
|
||||
label faceIndex = 0;
|
||||
forAll(zones, zoneI)
|
||||
for (const surfZone& zone : zones)
|
||||
{
|
||||
// Print all faces belonging to this zone
|
||||
const surfZone& zone = zones[zoneI];
|
||||
const label nLocalFaces = zone.size();
|
||||
|
||||
os << "solid " << zone.name() << nl;
|
||||
|
||||
if (useFaceMap)
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const label facei = faceMap[faceIndex++];
|
||||
writeShell(os, pointLst, faceLst[facei]);
|
||||
writeShell(os, pointLst, faceLst[faceMap[faceIndex++]]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
writeShell(os, pointLst, faceLst[faceIndex++]);
|
||||
}
|
||||
@ -274,11 +265,11 @@ void Foam::fileFormats::STLsurfaceFormat<Face>::writeBinary
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& faceMap = surf.faceMap();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& faceMap = surf.faceMap();
|
||||
|
||||
const List<surfZone>& zones =
|
||||
const UList<surfZone>& zones =
|
||||
(
|
||||
surf.surfZones().size() > 1
|
||||
? surf.surfZones()
|
||||
@ -292,36 +283,29 @@ void Foam::fileFormats::STLsurfaceFormat<Face>::writeBinary
|
||||
STLCore::writeBinaryHeader(os, nTris);
|
||||
|
||||
label faceIndex = 0;
|
||||
forAll(zones, zoneI)
|
||||
label zoneIndex = 0;
|
||||
for (const surfZone& zone : zones)
|
||||
{
|
||||
const surfZone& zone = zones[zoneI];
|
||||
const label nLocalFaces = zone.size();
|
||||
|
||||
if (useFaceMap)
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
writeShell
|
||||
(
|
||||
os,
|
||||
pointLst,
|
||||
faceLst[faceMap[faceIndex++]],
|
||||
zoneI
|
||||
);
|
||||
const Face& f = faceLst[faceMap[faceIndex++]];
|
||||
writeShell(os, pointLst, f, zoneIndex);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
writeShell
|
||||
(
|
||||
os,
|
||||
pointLst,
|
||||
faceLst[faceIndex++],
|
||||
zoneI
|
||||
);
|
||||
const Face& f = faceLst[faceIndex++];
|
||||
writeShell(os, pointLst, f, zoneIndex);
|
||||
}
|
||||
}
|
||||
|
||||
++zoneIndex;
|
||||
}
|
||||
}
|
||||
|
||||
@ -342,35 +326,35 @@ void Foam::fileFormats::STLsurfaceFormat<Face>::writeAscii
|
||||
}
|
||||
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
|
||||
// a single zone - we can skip sorting
|
||||
// A single zone - we can skip sorting
|
||||
if (surf.zoneToc().size() == 1)
|
||||
{
|
||||
os << "solid " << surf.zoneToc()[0].name() << nl;
|
||||
forAll(faceLst, facei)
|
||||
for (const Face& f : faceLst)
|
||||
{
|
||||
writeShell(os, pointLst, faceLst[facei]);
|
||||
writeShell(os, pointLst, f);
|
||||
}
|
||||
os << "endsolid " << surf.zoneToc()[0].name() << endl;
|
||||
os << "endsolid " << surf.zoneToc()[0].name() << nl;
|
||||
}
|
||||
else
|
||||
{
|
||||
labelList faceMap;
|
||||
List<surfZone> zoneLst = surf.sortedZones(faceMap);
|
||||
else
|
||||
{
|
||||
labelList faceMap;
|
||||
List<surfZone> zoneLst = surf.sortedZones(faceMap);
|
||||
|
||||
writeAscii
|
||||
(
|
||||
filename,
|
||||
MeshedSurfaceProxy<Face>
|
||||
(
|
||||
pointLst,
|
||||
faceLst,
|
||||
zoneLst,
|
||||
faceMap
|
||||
)
|
||||
);
|
||||
}
|
||||
writeAscii
|
||||
(
|
||||
filename,
|
||||
MeshedSurfaceProxy<Face>
|
||||
(
|
||||
pointLst,
|
||||
faceLst,
|
||||
zoneLst,
|
||||
faceMap
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -389,15 +373,15 @@ void Foam::fileFormats::STLsurfaceFormat<Face>::writeBinary
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& zoneIds = surf.zoneIds();
|
||||
const pointField& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& zoneIds = surf.zoneIds();
|
||||
|
||||
// Write the STL header
|
||||
unsigned int nTris = surf.nTriangles();
|
||||
STLCore::writeBinaryHeader(os, nTris);
|
||||
|
||||
// always write unsorted
|
||||
// Always write unsorted
|
||||
forAll(faceLst, facei)
|
||||
{
|
||||
writeShell
|
||||
@ -415,11 +399,21 @@ template<class Face>
|
||||
void Foam::fileFormats::STLsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
// Auto-detect ASCII/BINARY extension
|
||||
write(filename, surf, STLCore::UNKNOWN);
|
||||
// Detect "stlb" extension
|
||||
bool useBinary = STLCore::isBinaryName(filename, STLCore::UNKNOWN);
|
||||
|
||||
if (useBinary)
|
||||
{
|
||||
writeBinary(filename, surf);
|
||||
}
|
||||
else
|
||||
{
|
||||
writeAscii(filename, surf);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -428,7 +422,7 @@ void Foam::fileFormats::STLsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const STLFormat& format
|
||||
const STLFormat format
|
||||
)
|
||||
{
|
||||
if (STLCore::isBinaryName(filename, format))
|
||||
@ -446,11 +440,21 @@ template<class Face>
|
||||
void Foam::fileFormats::STLsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
// Auto-detect ASCII/BINARY extension
|
||||
write(filename, surf, STLCore::UNKNOWN);
|
||||
// Detect "stlb" extension
|
||||
bool useBinary = STLCore::isBinaryName(filename, STLCore::UNKNOWN);
|
||||
|
||||
if (useBinary)
|
||||
{
|
||||
writeBinary(filename, surf);
|
||||
}
|
||||
else
|
||||
{
|
||||
writeAscii(filename, surf);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -459,7 +463,7 @@ void Foam::fileFormats::STLsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const STLFormat& format
|
||||
const STLFormat format
|
||||
)
|
||||
{
|
||||
if (STLCore::isBinaryName(filename, format))
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -53,7 +53,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class STLsurfaceFormat Declaration
|
||||
Class fileFormats::STLsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -67,17 +67,17 @@ class STLsurfaceFormat
|
||||
//- Write Face (ASCII)
|
||||
static inline void writeShell
|
||||
(
|
||||
Ostream&,
|
||||
const pointField&,
|
||||
const Face&
|
||||
Ostream& os,
|
||||
const UList<point>& pts,
|
||||
const Face& f
|
||||
);
|
||||
|
||||
//- Write Face (BINARY)
|
||||
static inline void writeShell
|
||||
(
|
||||
ostream&,
|
||||
const pointField&,
|
||||
const Face&,
|
||||
ostream& os,
|
||||
const UList<point>& pts,
|
||||
const Face& f,
|
||||
const label zoneI
|
||||
);
|
||||
|
||||
@ -94,97 +94,94 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from file name
|
||||
STLsurfaceFormat(const fileName&);
|
||||
|
||||
|
||||
// Selectors
|
||||
|
||||
//- Read file and return surface
|
||||
static autoPtr<MeshedSurface<Face>> New(const fileName& name)
|
||||
{
|
||||
return autoPtr<MeshedSurface<Face>>
|
||||
(
|
||||
new STLsurfaceFormat<Face>(name)
|
||||
);
|
||||
}
|
||||
STLsurfaceFormat(const fileName& filename);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~STLsurfaceFormat()
|
||||
{}
|
||||
virtual ~STLsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy (as ASCII)
|
||||
static void writeAscii
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
);
|
||||
|
||||
//- Write surface mesh components by proxy (as BINARY)
|
||||
static void writeBinary
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
);
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
// as ASCII or BINARY, depending on the extension
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
);
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
// as ASCII or BINARY or dependent on the extension
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&,
|
||||
const STLFormat&
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
);
|
||||
|
||||
//- Write UnsortedMeshedSurface (as ASCII) sorted by zone
|
||||
static void writeAscii
|
||||
(
|
||||
const fileName&,
|
||||
const UnsortedMeshedSurface<Face>&
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf
|
||||
);
|
||||
|
||||
//- Write UnsortedMeshedSurface (as BINARY) unsorted by zone
|
||||
static void writeBinary
|
||||
(
|
||||
const fileName&,
|
||||
const UnsortedMeshedSurface<Face>&
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf
|
||||
);
|
||||
|
||||
//- Write UnsortedMeshedSurface
|
||||
// as ASCII or BINARY, depending on the extension
|
||||
//- Write surface mesh components by proxy
|
||||
// as ASCII or BINARY or dependent on the extension
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const UnsortedMeshedSurface<Face>&
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const STLFormat format
|
||||
);
|
||||
|
||||
//- Write UnsortedMeshedSurface
|
||||
// as ASCII or BINARY or dependent on the extension
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const UnsortedMeshedSurface<Face>&,
|
||||
const STLFormat&
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const STLFormat format
|
||||
);
|
||||
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
// as ASCII or BINARY, depending on the extension
|
||||
static void write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
//- Write UnsortedMeshedSurface
|
||||
// as ASCII or BINARY, depending on the extension
|
||||
static void write
|
||||
(
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Read from file
|
||||
virtual bool read(const fileName&);
|
||||
virtual bool read(const fileName& filename);
|
||||
|
||||
//- Write object
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this));
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -2,8 +2,8 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -23,10 +23,10 @@ License
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
#include "STLCore.H"
|
||||
#include "primitivePatch.H"
|
||||
|
||||
#include "STLReader.H"
|
||||
#include "Fstream.H"
|
||||
#include "triSurface.H"
|
||||
|
||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
||||
|
||||
@ -42,13 +42,86 @@ struct triSurfaceSTLCore
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void Foam::triSurface::writeSTLASCII(const bool writeSorted, Ostream& os) const
|
||||
bool Foam::triSurface::readSTL(const fileName& filename, bool forceBinary)
|
||||
{
|
||||
labelList faceMap;
|
||||
// Read in the values
|
||||
fileFormats::STLReader reader
|
||||
(
|
||||
filename,
|
||||
(
|
||||
forceBinary
|
||||
? fileFormats::STLCore::BINARY
|
||||
: fileFormats::STLCore::UNKNOWN
|
||||
)
|
||||
);
|
||||
|
||||
// Get the map for stitched surface points, with merge tolerance depending
|
||||
// on the input format
|
||||
labelList pointMap;
|
||||
const label nUniquePoints = reader.mergePointsMap(pointMap);
|
||||
|
||||
const auto& readpts = reader.points();
|
||||
const labelList& zoneIds = reader.zoneIds();
|
||||
|
||||
pointField& pointLst = storedPoints();
|
||||
List<Face>& faceLst = storedFaces();
|
||||
|
||||
// Sizing
|
||||
pointLst.setSize(nUniquePoints);
|
||||
faceLst.setSize(zoneIds.size());
|
||||
|
||||
// Assign points
|
||||
forAll(readpts, pointi)
|
||||
{
|
||||
pointLst[pointMap[pointi]] = readpts[pointi];
|
||||
}
|
||||
|
||||
// Assign triangles
|
||||
label pointi = 0;
|
||||
forAll(faceLst, i)
|
||||
{
|
||||
Face& f = faceLst[i];
|
||||
|
||||
f[0] = pointMap[pointi++];
|
||||
f[1] = pointMap[pointi++];
|
||||
f[2] = pointMap[pointi++];
|
||||
f.region() = zoneIds[i];
|
||||
}
|
||||
|
||||
// Set patch name/index.
|
||||
if (reader.stlFormat() == fileFormats::STLCore::ASCII)
|
||||
{
|
||||
const List<word>& names = reader.names();
|
||||
|
||||
patches_.setSize(names.size());
|
||||
forAll(patches_, patchi)
|
||||
{
|
||||
patches_[patchi] = geometricSurfacePatch(names[patchi], patchi);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void Foam::triSurface::writeSTLASCII
|
||||
(
|
||||
const fileName& filename,
|
||||
const bool sort
|
||||
) const
|
||||
{
|
||||
OFstream os(filename);
|
||||
if (!os.good())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Cannot open file for writing " << filename
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
labelList faceMap;
|
||||
surfacePatchList patches(calcPatches(faceMap));
|
||||
|
||||
if (writeSorted)
|
||||
if (sort)
|
||||
{
|
||||
label faceIndex = 0;
|
||||
forAll(patches, patchi)
|
||||
@ -62,7 +135,7 @@ void Foam::triSurface::writeSTLASCII(const bool writeSorted, Ostream& os) const
|
||||
(
|
||||
label patchFacei = 0;
|
||||
patchFacei < patch.size();
|
||||
patchFacei++
|
||||
++patchFacei
|
||||
)
|
||||
{
|
||||
const label facei = faceMap[faceIndex++];
|
||||
@ -81,58 +154,60 @@ void Foam::triSurface::writeSTLASCII(const bool writeSorted, Ostream& os) const
|
||||
|
||||
os << "endsolid " << patch.name() << endl;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
else
|
||||
|
||||
// Get patch (=compact region) per face
|
||||
labelList patchIDs(size());
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
// Get patch (=compact region) per face
|
||||
labelList patchIDs(size());
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
label facei = patches[patchi].start();
|
||||
label facei = patches[patchi].start();
|
||||
|
||||
forAll(patches[patchi], i)
|
||||
forAll(patches[patchi], i)
|
||||
{
|
||||
patchIDs[faceMap[facei++]] = patchi;
|
||||
}
|
||||
}
|
||||
|
||||
label currentPatchi = -1;
|
||||
forAll(*this, facei)
|
||||
{
|
||||
if (currentPatchi != patchIDs[facei])
|
||||
{
|
||||
if (currentPatchi != -1)
|
||||
{
|
||||
patchIDs[faceMap[facei++]] = patchi;
|
||||
// Close previous solid
|
||||
os << "endsolid " << patches[currentPatchi].name() << nl;
|
||||
}
|
||||
currentPatchi = patchIDs[facei];
|
||||
os << "solid " << patches[currentPatchi].name() << nl;
|
||||
}
|
||||
|
||||
label currentPatchi = -1;
|
||||
forAll(*this, facei)
|
||||
{
|
||||
if (currentPatchi != patchIDs[facei])
|
||||
{
|
||||
if (currentPatchi != -1)
|
||||
{
|
||||
// Close previous solid
|
||||
os << "endsolid " << patches[currentPatchi].name() << nl;
|
||||
}
|
||||
currentPatchi = patchIDs[facei];
|
||||
os << "solid " << patches[currentPatchi].name() << nl;
|
||||
}
|
||||
const labelledTri& f = (*this)[facei];
|
||||
|
||||
const labelledTri& f = (*this)[facei];
|
||||
// Write ASCII
|
||||
STLtriangle::write
|
||||
(
|
||||
os,
|
||||
faceNormals()[facei],
|
||||
points()[f[0]],
|
||||
points()[f[1]],
|
||||
points()[f[2]]
|
||||
);
|
||||
}
|
||||
|
||||
// Write ASCII
|
||||
STLtriangle::write
|
||||
(
|
||||
os,
|
||||
faceNormals()[facei],
|
||||
points()[f[0]],
|
||||
points()[f[1]],
|
||||
points()[f[2]]
|
||||
);
|
||||
}
|
||||
|
||||
if (currentPatchi != -1)
|
||||
{
|
||||
os << "endsolid " << patches[currentPatchi].name() << nl;
|
||||
}
|
||||
if (currentPatchi != -1)
|
||||
{
|
||||
os << "endsolid " << patches[currentPatchi].name() << nl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Foam::triSurface::writeSTLBINARY(std::ostream& os) const
|
||||
void Foam::triSurface::writeSTLBINARY(const fileName& filename) const
|
||||
{
|
||||
std::ofstream os(filename, std::ios::binary);
|
||||
|
||||
// Write the STL header
|
||||
triSurfaceSTLCore::writeBinaryHeader(os, this->size());
|
||||
|
||||
@ -34,19 +34,21 @@ License
|
||||
|
||||
Foam::word Foam::fileFormats::surfaceFormatsCore::nativeExt("ofs");
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
||||
|
||||
Foam::string Foam::fileFormats::surfaceFormatsCore::getLineNoComment
|
||||
(
|
||||
IFstream& is
|
||||
ISstream& is,
|
||||
const char comment
|
||||
)
|
||||
{
|
||||
string line;
|
||||
Foam::string line;
|
||||
do
|
||||
{
|
||||
is.getLine(line);
|
||||
}
|
||||
while ((line.empty() || line[0] == '#') && is.good());
|
||||
while ((line.empty() || line[0] == comment) && is.good());
|
||||
|
||||
return line;
|
||||
}
|
||||
@ -168,23 +170,12 @@ bool Foam::fileFormats::surfaceFormatsCore::checkSupport
|
||||
{
|
||||
Info<<"Unknown file extension for " << functionName
|
||||
<< " : " << ext << nl
|
||||
<< "Valid types: " << flatOutput(available.sortedToc()) << endl;
|
||||
<< "Valid types: " << flatOutput(available.sortedToc()) << nl
|
||||
<< endl;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::surfaceFormatsCore::surfaceFormatsCore()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::surfaceFormatsCore::~surfaceFormatsCore()
|
||||
{}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -55,15 +55,19 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class surfaceFormatsCore Declaration
|
||||
Class fileFormats::surfaceFormatsCore Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class surfaceFormatsCore
|
||||
{
|
||||
protected:
|
||||
|
||||
//- Read non-empty and non-comment line
|
||||
static string getLineNoComment(ISstream& is, const char comment='#');
|
||||
|
||||
|
||||
//- Return a surfZone list with a single entry, the size of which
|
||||
// corresponds to that of the container
|
||||
//- corresponds to that of the container
|
||||
template<class Container>
|
||||
static List<surfZone> oneZone
|
||||
(
|
||||
@ -74,10 +78,6 @@ protected:
|
||||
return List<surfZone>(1, surfZone(name, container.size(), 0, 0));
|
||||
}
|
||||
|
||||
//- Read non-comment line
|
||||
static string getLineNoComment(IFstream&);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
// Static Data
|
||||
@ -125,11 +125,11 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
surfaceFormatsCore();
|
||||
surfaceFormatsCore() = default;
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~surfaceFormatsCore();
|
||||
virtual ~surfaceFormatsCore() = default;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -23,41 +23,36 @@ License
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "TRIsurfaceFormat.H"
|
||||
#include "TRIReader.H"
|
||||
#include "surfaceFormatsCore.H"
|
||||
#include "IFstream.H"
|
||||
#include "IOmanip.H"
|
||||
#include "StringStream.H"
|
||||
#include "mergePoints.H"
|
||||
#include "Map.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::TRIsurfaceFormatCore::TRIsurfaceFormatCore
|
||||
static Foam::string getLineNoComment
|
||||
(
|
||||
const fileName& filename
|
||||
Foam::ISstream& is,
|
||||
const char comment='#'
|
||||
)
|
||||
:
|
||||
sorted_(true),
|
||||
points_(0),
|
||||
zoneIds_(0),
|
||||
sizes_(0)
|
||||
{
|
||||
read(filename);
|
||||
Foam::string line;
|
||||
do
|
||||
{
|
||||
is.getLine(line);
|
||||
}
|
||||
while ((line.empty() || line[0] == comment) && is.good());
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::TRIsurfaceFormatCore::~TRIsurfaceFormatCore()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
bool Foam::fileFormats::TRIsurfaceFormatCore::read
|
||||
(
|
||||
const fileName& filename
|
||||
)
|
||||
bool Foam::fileFormats::TRIReader::readFile(const fileName& filename)
|
||||
{
|
||||
this->clear();
|
||||
sorted_ = true;
|
||||
@ -74,6 +69,7 @@ bool Foam::fileFormats::TRIsurfaceFormatCore::read
|
||||
// the rest of the reader resembles the STL binary reader
|
||||
DynamicList<STLpoint> dynPoints;
|
||||
DynamicList<label> dynZones;
|
||||
DynamicList<word> dynNames;
|
||||
DynamicList<label> dynSizes;
|
||||
HashTable<label> lookup;
|
||||
|
||||
@ -84,13 +80,14 @@ bool Foam::fileFormats::TRIsurfaceFormatCore::read
|
||||
|
||||
while (is.good())
|
||||
{
|
||||
string line = this->getLineNoComment(is);
|
||||
string line = getLineNoComment(is);
|
||||
|
||||
// Handle continuations?
|
||||
// if (line.removeEnd("\\"))
|
||||
// {
|
||||
// line += this->getLineNoComment(is);
|
||||
// }
|
||||
if (line.empty())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// Do not handle continuations
|
||||
|
||||
IStringStream lineStream(line);
|
||||
|
||||
@ -133,21 +130,23 @@ bool Foam::fileFormats::TRIsurfaceFormatCore::read
|
||||
const word rawName(lineStream);
|
||||
const word name("zone" + rawName.substr(1));
|
||||
|
||||
HashTable<label>::const_iterator fnd = lookup.cfind(name);
|
||||
if (fnd.found())
|
||||
const auto iter = lookup.cfind(name);
|
||||
if (iter.found())
|
||||
{
|
||||
if (zoneI != fnd())
|
||||
if (zoneI != iter.object())
|
||||
{
|
||||
// group appeared out of order
|
||||
sorted_ = false;
|
||||
sorted_ = false; // Group appeared out of order
|
||||
zoneI = iter.object();
|
||||
}
|
||||
zoneI = fnd();
|
||||
}
|
||||
else
|
||||
{
|
||||
zoneI = dynSizes.size();
|
||||
lookup.insert(name, zoneI);
|
||||
dynSizes.append(0);
|
||||
if (lookup.insert(name, zoneI))
|
||||
{
|
||||
dynNames.append(name);
|
||||
dynSizes.append(0);
|
||||
}
|
||||
}
|
||||
|
||||
dynZones.append(zoneI);
|
||||
@ -156,44 +155,68 @@ bool Foam::fileFormats::TRIsurfaceFormatCore::read
|
||||
|
||||
// skip empty groups
|
||||
label nZone = 0;
|
||||
forAll(dynSizes, zoneI)
|
||||
forAll(dynSizes, zonei)
|
||||
{
|
||||
if (dynSizes[zoneI])
|
||||
if (dynSizes[zonei])
|
||||
{
|
||||
if (nZone != zoneI)
|
||||
if (nZone != zonei)
|
||||
{
|
||||
dynSizes[nZone] = dynSizes[zoneI];
|
||||
dynNames[nZone] = dynNames[zonei];
|
||||
dynSizes[nZone] = dynSizes[zonei];
|
||||
}
|
||||
nZone++;
|
||||
++nZone;
|
||||
}
|
||||
}
|
||||
|
||||
// truncate addressed size
|
||||
dynNames.setCapacity(nZone);
|
||||
dynSizes.setCapacity(nZone);
|
||||
|
||||
// transfer to normal lists
|
||||
points_.transfer(dynPoints);
|
||||
zoneIds_.transfer(dynZones);
|
||||
names_.transfer(dynNames);
|
||||
sizes_.transfer(dynSizes);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void Foam::fileFormats::TRIsurfaceFormatCore::clear()
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::fileFormats::TRIReader::TRIReader
|
||||
(
|
||||
const fileName& filename
|
||||
)
|
||||
:
|
||||
sorted_(true),
|
||||
points_(),
|
||||
zoneIds_(),
|
||||
names_(),
|
||||
sizes_()
|
||||
{
|
||||
readFile(filename);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void Foam::fileFormats::TRIReader::clear()
|
||||
{
|
||||
sorted_ = true;
|
||||
points_.clear();
|
||||
zoneIds_.clear();
|
||||
names_.clear();
|
||||
sizes_.clear();
|
||||
}
|
||||
|
||||
|
||||
Foam::label Foam::fileFormats::TRIsurfaceFormatCore::mergePointsMap
|
||||
Foam::label Foam::fileFormats::TRIReader::mergePointsMap
|
||||
(
|
||||
labelList& pointMap
|
||||
) const
|
||||
{
|
||||
// Use merge tolerance as per STL ascii
|
||||
// Use merge tolerance as per STL ASCII
|
||||
return mergePointsMap
|
||||
(
|
||||
100 * doubleScalarSMALL,
|
||||
@ -202,7 +225,7 @@ Foam::label Foam::fileFormats::TRIsurfaceFormatCore::mergePointsMap
|
||||
}
|
||||
|
||||
|
||||
Foam::label Foam::fileFormats::TRIsurfaceFormatCore::mergePointsMap
|
||||
Foam::label Foam::fileFormats::TRIReader::mergePointsMap
|
||||
(
|
||||
const scalar mergeTol,
|
||||
labelList& pointMap
|
||||
@ -22,21 +22,27 @@ License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Class
|
||||
Foam::fileFormats::TRIsurfaceFormatCore
|
||||
Foam::fileFormats::TRIReader
|
||||
|
||||
Description
|
||||
Internal class used by the TRIsurfaceFormat
|
||||
TRI (triangle) file reader.
|
||||
|
||||
For TRI format (eg, AC3D).
|
||||
Each input line has 9 floats (3 points, each 3 floats) followed by hex
|
||||
colour. The colour is used to build regions numbered from 0 upwards.
|
||||
|
||||
Reading and stitching similar to the STLReader.
|
||||
|
||||
SourceFiles
|
||||
TRIsurfaceFormatCore.C
|
||||
TRIReader.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef TRIsurfaceFormatCore_H
|
||||
#define TRIsurfaceFormatCore_H
|
||||
#ifndef TRIReader_H
|
||||
#define TRIReader_H
|
||||
|
||||
#include "surfaceFormatsCore.H"
|
||||
#include "STLpoint.H"
|
||||
#include "labelList.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -46,12 +52,10 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class TRIsurfaceFormatCore Declaration
|
||||
Class fileFormats::TRIReader Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class TRIsurfaceFormatCore
|
||||
:
|
||||
public surfaceFormatsCore
|
||||
class TRIReader
|
||||
{
|
||||
// Private Data
|
||||
|
||||
@ -63,19 +67,22 @@ class TRIsurfaceFormatCore
|
||||
//- The zones associated with the faces
|
||||
List<label> zoneIds_;
|
||||
|
||||
//- The zone names, in the order of their first appearance
|
||||
List<word> names_;
|
||||
|
||||
//- The solid count, in the order of their first appearance
|
||||
List<label> sizes_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
bool readFile(const fileName& filename);
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
TRIsurfaceFormatCore(const TRIsurfaceFormatCore&) = delete;
|
||||
TRIReader(const TRIReader&) = delete;
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const TRIsurfaceFormatCore&) = delete;
|
||||
|
||||
bool read(const fileName&);
|
||||
TRIReader& operator=(const TRIReader&) = delete;
|
||||
|
||||
|
||||
public:
|
||||
@ -83,11 +90,11 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Read from file, filling in the information
|
||||
TRIsurfaceFormatCore(const fileName& filename);
|
||||
TRIReader(const fileName& filename);
|
||||
|
||||
|
||||
//- Destructor
|
||||
~TRIsurfaceFormatCore();
|
||||
~TRIReader() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
@ -123,6 +130,12 @@ public:
|
||||
return zoneIds_;
|
||||
}
|
||||
|
||||
//- The list of solid names in the order of their first appearance
|
||||
inline List<word>& names()
|
||||
{
|
||||
return names_;
|
||||
}
|
||||
|
||||
//- The list of zone sizes in the order of their first appearance
|
||||
inline List<label>& sizes()
|
||||
{
|
||||
@ -24,7 +24,9 @@ License
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "TRIsurfaceFormat.H"
|
||||
#include "TRIReader.H"
|
||||
#include "OFstream.H"
|
||||
#include "ListOps.H"
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
@ -32,20 +34,20 @@ template<class Face>
|
||||
inline void Foam::fileFormats::TRIsurfaceFormat<Face>::writeShell
|
||||
(
|
||||
Ostream& os,
|
||||
const pointField& pointLst,
|
||||
const UList<point>& pts,
|
||||
const Face& f,
|
||||
const label zoneI
|
||||
)
|
||||
{
|
||||
// simple triangulation about f[0].
|
||||
// better triangulation should have been done before
|
||||
const point& p0 = pointLst[f[0]];
|
||||
const point& p0 = pts[f[0]];
|
||||
for (label fp1 = 1; fp1 < f.size() - 1; ++fp1)
|
||||
{
|
||||
label fp2 = f.fcIndex(fp1);
|
||||
const label fp2 = f.fcIndex(fp1);
|
||||
|
||||
const point& p1 = pointLst[f[fp1]];
|
||||
const point& p2 = pointLst[f[fp2]];
|
||||
const point& p1 = pts[f[fp1]];
|
||||
const point& p2 = pts[f[fp2]];
|
||||
|
||||
os << p0.x() << ' ' << p0.y() << ' ' << p0.z() << ' '
|
||||
<< p1.x() << ' ' << p1.y() << ' ' << p1.z() << ' '
|
||||
@ -79,7 +81,7 @@ bool Foam::fileFormats::TRIsurfaceFormat<Face>::read
|
||||
this->clear();
|
||||
|
||||
// Read in the values
|
||||
TRIsurfaceFormatCore reader(filename);
|
||||
TRIReader reader(filename);
|
||||
|
||||
// Get the map for stitched surface points
|
||||
labelList pointMap;
|
||||
@ -99,7 +101,7 @@ bool Foam::fileFormats::TRIsurfaceFormat<Face>::read
|
||||
List<label> sizes(reader.sizes().xfer());
|
||||
List<label> zoneIds(reader.zoneIds().xfer());
|
||||
|
||||
// generate the (sorted) faces
|
||||
// Generate the (sorted) faces
|
||||
List<Face> faceLst(zoneIds.size());
|
||||
|
||||
if (reader.sorted())
|
||||
@ -118,12 +120,12 @@ bool Foam::fileFormats::TRIsurfaceFormat<Face>::read
|
||||
}
|
||||
else
|
||||
{
|
||||
// Unsorted - determine the sorted order:
|
||||
// avoid SortableList since we discard the main list anyhow
|
||||
List<label> faceMap;
|
||||
// Determine the sorted order:
|
||||
// use sortedOrder directly (the intermediate list is discared anyhow)
|
||||
labelList faceMap;
|
||||
sortedOrder(zoneIds, faceMap);
|
||||
|
||||
// generate sorted faces
|
||||
// Generate sorted faces
|
||||
forAll(faceMap, facei)
|
||||
{
|
||||
const label startPt = 3*faceMap[facei];
|
||||
@ -137,7 +139,7 @@ bool Foam::fileFormats::TRIsurfaceFormat<Face>::read
|
||||
}
|
||||
zoneIds.clear();
|
||||
|
||||
// transfer:
|
||||
// Transfer:
|
||||
this->storedFaces().transfer(faceLst);
|
||||
|
||||
this->addZones(sizes);
|
||||
@ -151,14 +153,15 @@ template<class Face>
|
||||
void Foam::fileFormats::TRIsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& faceMap = surf.faceMap();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& faceMap = surf.faceMap();
|
||||
|
||||
const List<surfZone>& zones =
|
||||
const UList<surfZone>& zones =
|
||||
(
|
||||
surf.surfZones().empty()
|
||||
? surfaceFormatsCore::oneZone(faceLst)
|
||||
@ -176,26 +179,29 @@ void Foam::fileFormats::TRIsurfaceFormat<Face>::write
|
||||
}
|
||||
|
||||
label faceIndex = 0;
|
||||
forAll(zones, zoneI)
|
||||
label zoneIndex = 0;
|
||||
for (const surfZone& zone : zones)
|
||||
{
|
||||
const surfZone& zone = zones[zoneI];
|
||||
const label nLocalFaces = zone.size();
|
||||
|
||||
if (useFaceMap)
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceMap[faceIndex++]];
|
||||
writeShell(os, pointLst, f, zoneI);
|
||||
writeShell(os, pointLst, f, zoneIndex);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceIndex++];
|
||||
writeShell(os, pointLst, f, zoneI);
|
||||
writeShell(os, pointLst, f, zoneIndex);
|
||||
}
|
||||
}
|
||||
|
||||
++zoneIndex;
|
||||
}
|
||||
}
|
||||
|
||||
@ -204,11 +210,12 @@ template<class Face>
|
||||
void Foam::fileFormats::TRIsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
|
||||
OFstream os(filename);
|
||||
if (!os.good())
|
||||
@ -218,11 +225,10 @@ void Foam::fileFormats::TRIsurfaceFormat<Face>::write
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
|
||||
// a single zone needs no sorting
|
||||
// A single zone needs no sorting
|
||||
if (surf.zoneToc().size() == 1)
|
||||
{
|
||||
const List<label>& zoneIds = surf.zoneIds();
|
||||
const UList<label>& zoneIds = surf.zoneIds();
|
||||
|
||||
forAll(faceLst, facei)
|
||||
{
|
||||
@ -235,13 +241,18 @@ void Foam::fileFormats::TRIsurfaceFormat<Face>::write
|
||||
List<surfZone> zoneLst = surf.sortedZones(faceMap);
|
||||
|
||||
label faceIndex = 0;
|
||||
forAll(zoneLst, zoneI)
|
||||
label zoneIndex = 0;
|
||||
for (const surfZone& zone : zoneLst)
|
||||
{
|
||||
forAll(zoneLst[zoneI], localFacei)
|
||||
const label nLocalFaces = zone.size();
|
||||
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceMap[faceIndex++]];
|
||||
writeShell(os, pointLst, f, zoneI);
|
||||
writeShell(os, pointLst, f, zoneIndex);
|
||||
}
|
||||
|
||||
++zoneIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -39,7 +39,6 @@ SourceFiles
|
||||
#ifndef TRIsurfaceFormat_H
|
||||
#define TRIsurfaceFormat_H
|
||||
|
||||
#include "TRIsurfaceFormatCore.H"
|
||||
#include "MeshedSurface.H"
|
||||
#include "MeshedSurfaceProxy.H"
|
||||
#include "UnsortedMeshedSurface.H"
|
||||
@ -52,7 +51,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class TRIsurfaceFormat Declaration
|
||||
Class fileFormats::TRIsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -64,9 +63,9 @@ class TRIsurfaceFormat
|
||||
|
||||
static inline void writeShell
|
||||
(
|
||||
Ostream&,
|
||||
const pointField&,
|
||||
const Face&,
|
||||
Ostream& os,
|
||||
const UList<point>& pts,
|
||||
const Face& f,
|
||||
const label zoneI
|
||||
);
|
||||
|
||||
@ -82,50 +81,46 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct from file name
|
||||
TRIsurfaceFormat(const fileName&);
|
||||
|
||||
|
||||
// Selectors
|
||||
|
||||
//- Read file and return surface
|
||||
static autoPtr<MeshedSurface<Face>> New(const fileName& name)
|
||||
{
|
||||
return autoPtr<MeshedSurface<Face>>
|
||||
(
|
||||
new TRIsurfaceFormat<Face>(name)
|
||||
);
|
||||
}
|
||||
TRIsurfaceFormat(const fileName& filename);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~TRIsurfaceFormat()
|
||||
{}
|
||||
virtual ~TRIsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
//- Write UnsortedMeshedSurface,
|
||||
// by default the output is not sorted by zones
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const UnsortedMeshedSurface<Face>&
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Read from file
|
||||
virtual bool read(const fileName&);
|
||||
virtual bool read(const fileName& filename);
|
||||
|
||||
//- Write object
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this));
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -53,7 +53,7 @@ void Foam::fileFormats::VTKsurfaceFormat<Face>::writePolys
|
||||
{
|
||||
// connectivity count without additional storage (done internally)
|
||||
label nConnectivity = 0;
|
||||
for (const auto& f : faces)
|
||||
for (const Face& f : faces)
|
||||
{
|
||||
nConnectivity += f.size();
|
||||
}
|
||||
@ -109,7 +109,7 @@ bool Foam::fileFormats::VTKsurfaceFormat<Face>::read
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
// assume that the groups are not intermixed
|
||||
// Assume groups are not intermixed
|
||||
bool sorted = true;
|
||||
|
||||
|
||||
@ -187,9 +187,9 @@ bool Foam::fileFormats::VTKsurfaceFormat<Face>::read
|
||||
label nTri = 0;
|
||||
if (faceTraits<Face>::isTri())
|
||||
{
|
||||
forAll(faces, facei)
|
||||
for (const face& f : faces)
|
||||
{
|
||||
nTri += faces[facei].nTriangles();
|
||||
nTri += f.nTriangles();
|
||||
}
|
||||
}
|
||||
|
||||
@ -214,9 +214,9 @@ bool Foam::fileFormats::VTKsurfaceFormat<Face>::read
|
||||
|
||||
// Count
|
||||
labelList zoneSizes(nZones, 0);
|
||||
forAll(dynZones, triI)
|
||||
for (const label zonei : dynZones)
|
||||
{
|
||||
zoneSizes[dynZones[triI]]++;
|
||||
zoneSizes[zonei]++;
|
||||
}
|
||||
|
||||
this->sortFacesAndStore(dynFaces.xfer(), dynZones.xfer(), sorted);
|
||||
@ -227,17 +227,16 @@ bool Foam::fileFormats::VTKsurfaceFormat<Face>::read
|
||||
else
|
||||
{
|
||||
DynamicList<Face> dynFaces(faces.size());
|
||||
forAll(faces, facei)
|
||||
for (const face& f : faces)
|
||||
{
|
||||
const face& f = faces[facei];
|
||||
dynFaces.append(Face(f));
|
||||
}
|
||||
|
||||
// Count
|
||||
labelList zoneSizes(nZones, 0);
|
||||
forAll(zones, facei)
|
||||
for (const label zonei : zones)
|
||||
{
|
||||
zoneSizes[zones[facei]]++;
|
||||
zoneSizes[zonei]++;
|
||||
}
|
||||
|
||||
this->sortFacesAndStore(dynFaces.xfer(), zones.xfer(), sorted);
|
||||
@ -258,14 +257,15 @@ template<class Face>
|
||||
void Foam::fileFormats::VTKsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& faceMap = surf.faceMap();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& faceMap = surf.faceMap();
|
||||
|
||||
const List<surfZone>& zones =
|
||||
const UList<surfZone>& zones =
|
||||
(
|
||||
surf.surfZones().empty()
|
||||
? surfaceFormatsCore::oneZone(faceLst)
|
||||
@ -285,7 +285,7 @@ void Foam::fileFormats::VTKsurfaceFormat<Face>::write
|
||||
{
|
||||
// connectivity count without additional storage (done internally)
|
||||
label nConnectivity = 0;
|
||||
for (const auto& f : faceLst)
|
||||
for (const Face& f : faceLst)
|
||||
{
|
||||
nConnectivity += f.size();
|
||||
}
|
||||
@ -329,7 +329,8 @@ template<class Face>
|
||||
void Foam::fileFormats::VTKsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
std::ofstream os(filename);
|
||||
|
||||
@ -25,7 +25,8 @@ Class
|
||||
Foam::fileFormats::VTKsurfaceFormat
|
||||
|
||||
Description
|
||||
Provide a means of reading/writing VTK legacy format.
|
||||
Read/write VTK legacy format (ASCII) for surfaces.
|
||||
|
||||
The output is never sorted by zone.
|
||||
|
||||
SourceFiles
|
||||
@ -49,7 +50,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class VTKsurfaceFormat Declaration
|
||||
Class fileFormats::VTKsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -83,48 +84,42 @@ public:
|
||||
VTKsurfaceFormat(const fileName& filename);
|
||||
|
||||
|
||||
// Selectors
|
||||
|
||||
//- Read file and return surface
|
||||
static autoPtr<MeshedSurface<Face>> New(const fileName& name)
|
||||
{
|
||||
return autoPtr<MeshedSurface<Face>>
|
||||
(
|
||||
new VTKsurfaceFormat<Face>(name)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~VTKsurfaceFormat()
|
||||
{}
|
||||
virtual ~VTKsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
// Write
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
//- Write UnsortedMeshedSurface, the output remains unsorted
|
||||
static void write
|
||||
(
|
||||
const fileName& fileName,
|
||||
const UnsortedMeshedSurface<Face>& surf
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Read from file
|
||||
virtual bool read(const fileName& filename);
|
||||
|
||||
//- Write object file
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this));
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -32,7 +32,7 @@ License
|
||||
void Foam::fileFormats::VTKsurfaceFormatCore::writeHeader
|
||||
(
|
||||
vtk::formatter& format,
|
||||
const pointField& pts
|
||||
const UList<point>& pts
|
||||
)
|
||||
{
|
||||
vtk::legacy::fileHeader
|
||||
|
||||
@ -2,8 +2,8 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
\\ / A nd | Copyright (C) 2017 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -35,8 +35,9 @@ SourceFiles
|
||||
#ifndef VTKsurfaceFormatCore_H
|
||||
#define VTKsurfaceFormatCore_H
|
||||
|
||||
#include "MeshedSurface.H"
|
||||
#include "foamVtkFormatter.H"
|
||||
#include "point.H"
|
||||
#include "surfZone.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -46,20 +47,20 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class VTKsurfaceFormatCore Declaration
|
||||
Class fileFormats::VTKsurfaceFormatCore Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class VTKsurfaceFormatCore
|
||||
{
|
||||
protected:
|
||||
|
||||
// Protected Member Functions
|
||||
// Protected Static Member Functions
|
||||
|
||||
//- Write header information with points
|
||||
static void writeHeader
|
||||
(
|
||||
vtk::formatter& format,
|
||||
const pointField& pts
|
||||
const UList<point>& pts
|
||||
);
|
||||
|
||||
//- Write regions (zones) information as CellData
|
||||
|
||||
@ -66,7 +66,7 @@ void Foam::fileFormats::VTPsurfaceFormat<Face>::writePolys
|
||||
|
||||
format.writeSize(payLoad * sizeof(label));
|
||||
|
||||
for (const Face& f : faces)
|
||||
for (const auto& f : faces)
|
||||
{
|
||||
vtk::writeList(format, f);
|
||||
}
|
||||
@ -104,25 +104,19 @@ void Foam::fileFormats::VTPsurfaceFormat<Face>::writePolys
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
Foam::fileFormats::VTPsurfaceFormat<Face>::VTPsurfaceFormat()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
void Foam::fileFormats::VTPsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& faceMap = surf.faceMap();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& faceMap = surf.faceMap();
|
||||
|
||||
const List<surfZone>& zones =
|
||||
(
|
||||
@ -226,7 +220,8 @@ template<class Face>
|
||||
void Foam::fileFormats::VTPsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options
|
||||
)
|
||||
{
|
||||
std::ofstream os(filename, std::ios::binary);
|
||||
@ -234,7 +229,7 @@ void Foam::fileFormats::VTPsurfaceFormat<Face>::write
|
||||
autoPtr<vtk::formatter> format =
|
||||
vtk::newFormatter(os, fmtType);
|
||||
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
|
||||
writeHeader(format(), surf.points(), faceLst.size());
|
||||
|
||||
|
||||
@ -25,7 +25,8 @@ Class
|
||||
Foam::fileFormats::VTPsurfaceFormat
|
||||
|
||||
Description
|
||||
Provide a means of writing VTP (xml) format.
|
||||
Write surfaces in VTP (xml) format.
|
||||
|
||||
The output is never sorted by zone.
|
||||
|
||||
SourceFiles
|
||||
@ -49,7 +50,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class VTPsurfaceFormat Declaration
|
||||
Class fileFormats::VTPsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -80,36 +81,42 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
VTPsurfaceFormat();
|
||||
VTPsurfaceFormat() = default;
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~VTPsurfaceFormat()
|
||||
{}
|
||||
virtual ~VTPsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
// Write
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
//- Write UnsortedMeshedSurface, the output remains unsorted
|
||||
static void write
|
||||
(
|
||||
const fileName& filename,
|
||||
const UnsortedMeshedSurface<Face>& surf
|
||||
const UnsortedMeshedSurface<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Write object file
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this));
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -32,7 +32,7 @@ License
|
||||
void Foam::fileFormats::VTPsurfaceFormatCore::writeHeader
|
||||
(
|
||||
vtk::formatter& format,
|
||||
const pointField& pts,
|
||||
const UList<point>& pts,
|
||||
const label nFaces
|
||||
)
|
||||
{
|
||||
@ -142,7 +142,6 @@ void Foam::fileFormats::VTPsurfaceFormatCore::writeCellData
|
||||
format.endDataArray();
|
||||
|
||||
format.endTag(vtk::fileTag::CELL_DATA);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -35,8 +35,9 @@ SourceFiles
|
||||
#ifndef VTPsurfaceFormatCore_H
|
||||
#define VTPsurfaceFormatCore_H
|
||||
|
||||
#include "MeshedSurface.H"
|
||||
#include "foamVtkFormatter.H"
|
||||
#include "point.H"
|
||||
#include "surfZone.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -46,27 +47,26 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class VTPsurfaceFormatCore Declaration
|
||||
Class fileFormats::VTPsurfaceFormatCore Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class VTPsurfaceFormatCore
|
||||
{
|
||||
protected:
|
||||
|
||||
// Protected Member Functions
|
||||
// Protected Static Member Functions
|
||||
|
||||
//- Write file header information with points
|
||||
//- Write header information with points
|
||||
static void writeHeader
|
||||
(
|
||||
vtk::formatter& format,
|
||||
const pointField& pts,
|
||||
const UList<point>& pts,
|
||||
const label nFaces
|
||||
);
|
||||
|
||||
//- Write file footer
|
||||
//- Write footer
|
||||
static void writeFooter(vtk::formatter& format);
|
||||
|
||||
|
||||
//- Write regions (zones) information as CellData
|
||||
static void writeCellData
|
||||
(
|
||||
|
||||
@ -26,28 +26,22 @@ License
|
||||
#include "X3DsurfaceFormat.H"
|
||||
#include "OFstream.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
Foam::fileFormats::X3DsurfaceFormat<Face>::X3DsurfaceFormat()
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
template<class Face>
|
||||
void Foam::fileFormats::X3DsurfaceFormat<Face>::write
|
||||
(
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary&
|
||||
)
|
||||
{
|
||||
const pointField& pointLst = surf.points();
|
||||
const List<Face>& faceLst = surf.surfFaces();
|
||||
const List<label>& faceMap = surf.faceMap();
|
||||
const UList<point>& pointLst = surf.points();
|
||||
const UList<Face>& faceLst = surf.surfFaces();
|
||||
const UList<label>& faceMap = surf.faceMap();
|
||||
|
||||
// for no zones, suppress the group name
|
||||
const List<surfZone>& zones =
|
||||
const UList<surfZone>& zones =
|
||||
(
|
||||
surf.surfZones().empty()
|
||||
? surfaceFormatsCore::oneZone(faceLst, word::null)
|
||||
@ -80,13 +74,13 @@ void Foam::fileFormats::X3DsurfaceFormat<Face>::write
|
||||
" <IndexedFaceSet coordIndex='\n";
|
||||
|
||||
label faceIndex = 0;
|
||||
forAll(zones, zoneI)
|
||||
for (const surfZone& zone : zones)
|
||||
{
|
||||
const surfZone& zone = zones[zoneI];
|
||||
const label nLocalFaces = zone.size();
|
||||
|
||||
if (useFaceMap)
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceMap[faceIndex++]];
|
||||
|
||||
@ -99,7 +93,7 @@ void Foam::fileFormats::X3DsurfaceFormat<Face>::write
|
||||
}
|
||||
else
|
||||
{
|
||||
forAll(zone, localFacei)
|
||||
for (label i=0; i<nLocalFaces; ++i)
|
||||
{
|
||||
const Face& f = faceLst[faceIndex++];
|
||||
|
||||
@ -116,11 +110,8 @@ void Foam::fileFormats::X3DsurfaceFormat<Face>::write
|
||||
"' >\n"
|
||||
" <Coordinate point='\n";
|
||||
|
||||
// Write vertex coords
|
||||
forAll(pointLst, ptI)
|
||||
for (const point& pt : pointLst)
|
||||
{
|
||||
const point& pt = pointLst[ptI];
|
||||
|
||||
os << pt.x() << ' ' << pt.y() << ' ' << pt.z() << nl;
|
||||
}
|
||||
|
||||
@ -130,7 +121,6 @@ void Foam::fileFormats::X3DsurfaceFormat<Face>::write
|
||||
" </Shape>\n"
|
||||
" </Group>\n"
|
||||
"</X3D>\n";
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -48,7 +48,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class X3DsurfaceFormat Declaration
|
||||
Class fileFormats::X3DsurfaceFormat Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
template<class Face>
|
||||
@ -70,28 +70,34 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Construct null
|
||||
X3DsurfaceFormat();
|
||||
X3DsurfaceFormat() = default;
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~X3DsurfaceFormat()
|
||||
{}
|
||||
virtual ~X3DsurfaceFormat() = default;
|
||||
|
||||
|
||||
// Member Functions
|
||||
// Static Member Functions
|
||||
|
||||
//- Write surface mesh components by proxy
|
||||
static void write
|
||||
(
|
||||
const fileName&,
|
||||
const MeshedSurfaceProxy<Face>&
|
||||
const fileName& filename,
|
||||
const MeshedSurfaceProxy<Face>& surf,
|
||||
const dictionary& options = dictionary::null
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Write object
|
||||
virtual void write(const fileName& name) const
|
||||
virtual void write
|
||||
(
|
||||
const fileName& name,
|
||||
const dictionary& options = dictionary::null
|
||||
) const
|
||||
{
|
||||
write(name, MeshedSurfaceProxy<Face>(*this));
|
||||
write(name, MeshedSurfaceProxy<Face>(*this), options);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@ -35,7 +35,6 @@ SourceFiles
|
||||
#ifndef X3DsurfaceFormatCore_H
|
||||
#define X3DsurfaceFormatCore_H
|
||||
|
||||
#include "MeshedSurface.H"
|
||||
#include "Ostream.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
@ -46,7 +45,7 @@ namespace fileFormats
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class X3DsurfaceFormatCore Declaration
|
||||
Class fileFormats::X3DsurfaceFormatCore Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class X3DsurfaceFormatCore
|
||||
@ -55,10 +54,10 @@ protected:
|
||||
// Protected Member Functions
|
||||
|
||||
//- Write file header
|
||||
static void writeHeader(Ostream&);
|
||||
static void writeHeader(Ostream& os);
|
||||
|
||||
//- Write appearance node
|
||||
static void writeAppearance(Ostream&);
|
||||
static void writeAppearance(Ostream& os);
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -30,11 +30,11 @@ License
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
defineTypeNameAndDebug(surfaceRegistry, 0);
|
||||
defineTypeNameAndDebug(surfaceRegistry, 0);
|
||||
}
|
||||
|
||||
|
||||
const Foam::word Foam::surfaceRegistry::prefix("surfaces");
|
||||
|
||||
Foam::word Foam::surfaceRegistry::defaultName("default");
|
||||
|
||||
|
||||
@ -61,10 +61,4 @@ Foam::surfaceRegistry::surfaceRegistry
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||
|
||||
Foam::surfaceRegistry::~surfaceRegistry()
|
||||
{}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -57,7 +57,7 @@ class surfaceRegistry
|
||||
surfaceRegistry(const surfaceRegistry&) = delete;
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const surfaceRegistry&) = delete;
|
||||
surfaceRegistry& operator=(const surfaceRegistry&) = delete;
|
||||
|
||||
|
||||
public:
|
||||
@ -77,13 +77,14 @@ public:
|
||||
//- Construct for the given objectRegistry and named surface
|
||||
surfaceRegistry
|
||||
(
|
||||
const objectRegistry&,
|
||||
const objectRegistry& obr,
|
||||
const word& surfName = word::null
|
||||
);
|
||||
|
||||
|
||||
//- Destructor
|
||||
virtual ~surfaceRegistry();
|
||||
virtual ~surfaceRegistry() = default;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -1,349 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Description
|
||||
Reader for .ac files generated by AC3D.
|
||||
|
||||
See http://www.ac3d.org/ac3d/man/ac3dfileformat.html
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
#include "IFstream.H"
|
||||
#include "StringStream.H"
|
||||
#include "transform.H"
|
||||
#include "tensor.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
static label parseInt(const string& str)
|
||||
{
|
||||
IStringStream intStream(str);
|
||||
|
||||
label a;
|
||||
|
||||
intStream >> a;
|
||||
|
||||
return a;
|
||||
}
|
||||
|
||||
|
||||
static bool readCmd(IFstream& ACfile, string& cmd, string& args)
|
||||
{
|
||||
if (ACfile.good())
|
||||
{
|
||||
string line;
|
||||
ACfile.getLine(line);
|
||||
|
||||
string::size_type space = line.find(' ');
|
||||
|
||||
if (space != string::npos)
|
||||
{
|
||||
cmd = line.substr(0, space);
|
||||
args = line.substr(space+1);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Read up to line starting with cmd. Sets args to rest of line.
|
||||
// Returns true if found, false if stream is not good anymore.
|
||||
static bool readUpto
|
||||
(
|
||||
const string& cmd,
|
||||
IFstream& ACfile,
|
||||
string& args
|
||||
)
|
||||
{
|
||||
while (ACfile.good())
|
||||
{
|
||||
string line;
|
||||
ACfile.getLine(line);
|
||||
|
||||
string::size_type space = line.find(' ');
|
||||
|
||||
if (space != string::npos && line.substr(0, space) == cmd)
|
||||
{
|
||||
args = line.substr(space+1);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Likewise but throws error if cmd not found
|
||||
static void readUpto
|
||||
(
|
||||
const string& cmd,
|
||||
IFstream& ACfile,
|
||||
string& args,
|
||||
const string errorMsg
|
||||
)
|
||||
{
|
||||
if (!readUpto(cmd, ACfile, args))
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Cannot find command " << cmd
|
||||
<< errorMsg << exit(FatalError);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
bool triSurface::readAC(const fileName& ACfileName)
|
||||
{
|
||||
IFstream ACfile(ACfileName);
|
||||
|
||||
if (!ACfile.good())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Cannot read file " << ACfileName
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
string line;
|
||||
ACfile.getLine(line);
|
||||
|
||||
string version = line.substr(4);
|
||||
|
||||
if (version != "b")
|
||||
{
|
||||
WarningInFunction
|
||||
<< "When reading AC3D file " << ACfileName
|
||||
<< " read header " << line << " with version " << version
|
||||
<< endl << "Only tested reading with version 'b'."
|
||||
<< " This might give problems" << endl;
|
||||
}
|
||||
|
||||
string cmd;
|
||||
|
||||
string args;
|
||||
|
||||
if (!readUpto("OBJECT", ACfile, args) || (args != "world"))
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Cannot find \"OBJECT world\" in file " << ACfileName
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
// Number of kids = patches
|
||||
|
||||
readUpto("kids", ACfile, args, "");
|
||||
|
||||
label nPatches = parseInt(args);
|
||||
|
||||
// Storage for patches and unmerged points and faces
|
||||
|
||||
DynamicList<point> points;
|
||||
DynamicList<labelledTri> faces;
|
||||
geometricSurfacePatchList patches(nPatches);
|
||||
|
||||
|
||||
// Start of vertices for object/patch
|
||||
label patchStartVert = 0;
|
||||
|
||||
for (label patchi = 0; patchi < nPatches; patchi++)
|
||||
{
|
||||
readUpto
|
||||
(
|
||||
"OBJECT",
|
||||
ACfile,
|
||||
args,
|
||||
" while reading patch " + Foam::name(patchi)
|
||||
);
|
||||
|
||||
// Object global values
|
||||
string patchName = string("patch") + Foam::name(patchi);
|
||||
label nVerts = 0;
|
||||
tensor rot(I);
|
||||
vector loc(0, 0, 0);
|
||||
|
||||
// Read all info for current patch
|
||||
while (ACfile.good())
|
||||
{
|
||||
// Read line and get first word. If end of file break since
|
||||
// patch should always end with 'kids' command ?not sure.
|
||||
if (!readCmd(ACfile, cmd, args))
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Did not read up to \"kids 0\" while reading patch "
|
||||
<< patchi << " from file " << ACfileName
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
if (cmd == "name")
|
||||
{
|
||||
IStringStream nameStream(args);
|
||||
|
||||
nameStream >> patchName;
|
||||
}
|
||||
else if (cmd == "rot")
|
||||
{
|
||||
// rot %f %f %f %f %f %f %f %f %f
|
||||
IStringStream lineStream(args);
|
||||
|
||||
lineStream
|
||||
>> rot.xx() >> rot.xy() >> rot.xz()
|
||||
>> rot.yx() >> rot.yy() >> rot.yz()
|
||||
>> rot.zx() >> rot.zy() >> rot.zz();
|
||||
|
||||
WarningInFunction
|
||||
<< "rot (rotation tensor) command not implemented"
|
||||
<< "Line:" << cmd << ' ' << args << endl
|
||||
<< "while reading patch " << patchi << endl;
|
||||
}
|
||||
else if (cmd == "loc")
|
||||
{
|
||||
IStringStream lineStream(args);
|
||||
|
||||
lineStream >> loc.x() >> loc.y() >> loc.z();
|
||||
}
|
||||
else if (cmd == "numvert")
|
||||
{
|
||||
nVerts = parseInt(args);
|
||||
|
||||
for (label vertI = 0; vertI < nVerts; vertI++)
|
||||
{
|
||||
ACfile.getLine(line);
|
||||
|
||||
IStringStream lineStream(line);
|
||||
|
||||
point pt;
|
||||
|
||||
lineStream >> pt.x() >> pt.y() >> pt.z();
|
||||
|
||||
// Offset with current translation vector
|
||||
points.append(pt+loc);
|
||||
}
|
||||
}
|
||||
else if (cmd == "numsurf")
|
||||
{
|
||||
label nTris = parseInt(args);
|
||||
|
||||
for (label triI = 0; triI < nTris; triI++)
|
||||
{
|
||||
static string errorMsg =
|
||||
string(" while reading face ")
|
||||
+ name(triI) + " on patch " + name(patchi)
|
||||
+ " from file " + ACfileName;
|
||||
|
||||
readUpto("SURF", ACfile, args, errorMsg);
|
||||
readUpto("mat", ACfile, args, errorMsg);
|
||||
readUpto("refs", ACfile, args, errorMsg);
|
||||
|
||||
label size = parseInt(args);
|
||||
|
||||
if (size != 3)
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Can only read surfaces with 3 vertices."
|
||||
<< endl
|
||||
<< "Detected " << size << " when reading triangle "
|
||||
<< triI << " of patch " << patchi
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
ACfile.getLine(line);
|
||||
|
||||
label v0 = parseInt(line);
|
||||
|
||||
ACfile.getLine(line);
|
||||
|
||||
label v1 = parseInt(line);
|
||||
|
||||
ACfile.getLine(line);
|
||||
|
||||
label v2 = parseInt(line);
|
||||
|
||||
faces.append
|
||||
(
|
||||
labelledTri
|
||||
(
|
||||
v0 + patchStartVert,
|
||||
v1 + patchStartVert,
|
||||
v2 + patchStartVert,
|
||||
patchi
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
// Done the current patch. Increment the offset vertices are
|
||||
// stored at
|
||||
patchStartVert += nVerts;
|
||||
}
|
||||
else if (cmd == "kids")
|
||||
{
|
||||
// 'kids' denotes the end of the current patch.
|
||||
|
||||
label nKids = parseInt(args);
|
||||
|
||||
if (nKids != 0)
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Can only read objects without kids."
|
||||
<< " Encountered " << nKids << " kids when"
|
||||
<< " reading patch " << patchi
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
patches[patchi] =
|
||||
geometricSurfacePatch
|
||||
(
|
||||
word(patchName),
|
||||
patchi
|
||||
);
|
||||
|
||||
// Stop reading current patch
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
faces.shrink();
|
||||
|
||||
// Transfer DynamicLists to straight ones.
|
||||
pointField allPoints(points.xfer());
|
||||
|
||||
*this = triSurface(faces, patches, allPoints, true);
|
||||
|
||||
stitchTriangles();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -1,139 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
#include "IOmanip.H"
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void Foam::triSurface::writeAC(Ostream& os) const
|
||||
{
|
||||
// Write with patches as separate objects under "world" object.
|
||||
// Header is taken over from sample file.
|
||||
// Defines separate materials for all patches. Recycle colours.
|
||||
|
||||
// Define 8 standard colours as r,g,b components
|
||||
static scalar colourMap[] =
|
||||
{
|
||||
1, 1, 1,
|
||||
1, 0, 0,
|
||||
0, 1, 0,
|
||||
0, 0, 1,
|
||||
1, 1, 0,
|
||||
0, 1, 1,
|
||||
1, 0, 1,
|
||||
0.5, 0.5, 1
|
||||
};
|
||||
|
||||
// Calculate patch face indexing
|
||||
|
||||
labelList faceMap;
|
||||
|
||||
surfacePatchList patches(calcPatches(faceMap));
|
||||
|
||||
|
||||
// Write header. Define materials.
|
||||
|
||||
os << "AC3Db" << endl;
|
||||
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
const word& pName = patches[patchi].name();
|
||||
|
||||
label colourI = patchi % 8;
|
||||
label colourCompI = 3 * colourI;
|
||||
|
||||
os << "MATERIAL \"" << pName << "Mat\" rgb "
|
||||
<< colourMap[colourCompI] << ' ' << colourMap[colourCompI+1]
|
||||
<< ' ' << colourMap[colourCompI+2]
|
||||
<< " amb 0.2 0.2 0.2 emis 0 0 0 spec 0.5 0.5 0.5 shi 10"
|
||||
<< " trans 0"
|
||||
<< endl;
|
||||
}
|
||||
|
||||
os << "OBJECT world" << endl
|
||||
<< "kids " << patches.size() << endl;
|
||||
|
||||
|
||||
// Write patch points & faces.
|
||||
|
||||
label faceIndex = 0;
|
||||
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
const surfacePatch& sp = patches[patchi];
|
||||
|
||||
os << "OBJECT poly" << endl
|
||||
<< "name \"" << sp.name() << '"' << endl;
|
||||
|
||||
// Create patch with only patch faces included for ease of addressing
|
||||
|
||||
boolList include(size(), false);
|
||||
|
||||
forAll(sp, patchFacei)
|
||||
{
|
||||
const label facei = faceMap[faceIndex++];
|
||||
|
||||
include[facei] = true;
|
||||
}
|
||||
|
||||
labelList pointMap;
|
||||
labelList faceMap;
|
||||
|
||||
triSurface patch = subsetMesh(include, pointMap, faceMap);
|
||||
|
||||
// Now we have triSurface for this patch alone. Write it.
|
||||
|
||||
os << "numvert " << patch.nPoints() << endl;
|
||||
|
||||
forAll(patch.localPoints(), ptI)
|
||||
{
|
||||
const point& pt = patch.localPoints()[ptI];
|
||||
|
||||
os << pt.x() << ' ' << pt.y() << ' ' << pt.z() << endl;
|
||||
}
|
||||
|
||||
os << "numsurf " << patch.localFaces().size() << endl;
|
||||
|
||||
forAll(patch.localFaces(), facei)
|
||||
{
|
||||
const labelledTri& f = patch.localFaces()[facei];
|
||||
|
||||
os << "SURF 0x20" << endl // polygon
|
||||
<< "mat " << patchi << endl
|
||||
<< "refs " << f.size() << endl;
|
||||
|
||||
os << f[0] << " 0 0" << endl;
|
||||
os << f[1] << " 0 0" << endl;
|
||||
os << f[2] << " 0 0" << endl;
|
||||
}
|
||||
|
||||
os << "kids 0" << endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -1,161 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||
\\/ 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
#include "IFstream.H"
|
||||
#include "StringStream.H"
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
bool Foam::triSurface::readGTS(const fileName& GTSfileName)
|
||||
{
|
||||
IFstream GTSfile(GTSfileName);
|
||||
|
||||
if (!GTSfile.good())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Cannot read file " << GTSfileName
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
// Read header
|
||||
label nPoints, nEdges, nElems;
|
||||
|
||||
string line = getLineNoComment(GTSfile);
|
||||
{
|
||||
IStringStream lineStream(line);
|
||||
lineStream >> nPoints >> nEdges >> nElems;
|
||||
}
|
||||
|
||||
// Read points
|
||||
pointField& points_ = const_cast<pointField&>(points());
|
||||
points_.setSize(nPoints);
|
||||
|
||||
forAll(points_, pointi)
|
||||
{
|
||||
scalar x, y, z;
|
||||
line = getLineNoComment(GTSfile);
|
||||
{
|
||||
IStringStream lineStream(line);
|
||||
lineStream >> x >> y >> z;
|
||||
}
|
||||
points_[pointi] = point(x, y, z);
|
||||
}
|
||||
|
||||
// Read edges (Foam indexing)
|
||||
edgeList edges(nEdges);
|
||||
forAll(edges, edgei)
|
||||
{
|
||||
label start, end;
|
||||
line = getLineNoComment(GTSfile);
|
||||
{
|
||||
IStringStream lineStream(line);
|
||||
lineStream >> start >> end;
|
||||
}
|
||||
edges[edgei] = edge(start - 1, end - 1);
|
||||
}
|
||||
|
||||
// Read triangles. Convert references to edges into pointlabels
|
||||
setSize(nElems);
|
||||
forAll(*this, trianglei)
|
||||
{
|
||||
label e0Label, e1Label, e2Label;
|
||||
label region = 0;
|
||||
|
||||
line = getLineNoComment(GTSfile);
|
||||
{
|
||||
IStringStream lineStream(line);
|
||||
lineStream >> e0Label >> e1Label >> e2Label;
|
||||
|
||||
// Optional region number: read first, then check state on stream
|
||||
if (lineStream)
|
||||
{
|
||||
label num;
|
||||
lineStream >> num;
|
||||
if (!lineStream.bad())
|
||||
{
|
||||
region = num;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Determine ordering of edges e0, e1
|
||||
// common:common vertex, shared by e0 and e1
|
||||
// e0Far:vertex on e0 which is not common
|
||||
// e1Far: ,, e1 ,,
|
||||
const edge& e0 = edges[e0Label - 1];
|
||||
const edge& e1 = edges[e1Label - 1];
|
||||
const edge& e2 = edges[e2Label - 1];
|
||||
|
||||
label common01 = e0.commonVertex(e1);
|
||||
if (common01 == -1)
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Edges 0 and 1 of triangle " << trianglei
|
||||
<< " do not share a point.\n"
|
||||
<< " edge0:" << e0 << endl
|
||||
<< " edge1:" << e1
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
label e0Far = e0.otherVertex(common01);
|
||||
label e1Far = e1.otherVertex(common01);
|
||||
|
||||
label common12 = e1.commonVertex(e2);
|
||||
if (common12 == -1)
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Edges 1 and 2 of triangle " << trianglei
|
||||
<< " do not share a point.\n"
|
||||
<< " edge1:" << e1 << endl
|
||||
<< " edge2:" << e2
|
||||
<< exit(FatalError);
|
||||
}
|
||||
label e2Far = e2.otherVertex(common12);
|
||||
|
||||
// Does edge2 sit between edge1 and 0?
|
||||
if ((common12 != e1Far) || (e2Far != e0Far))
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Edges of triangle " << trianglei
|
||||
<< " reference more than three points.\n"
|
||||
<< " edge0:" << e0 << endl
|
||||
<< " edge1:" << e1 << endl
|
||||
<< " edge2:" << e2 << endl
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
operator[](trianglei) = labelledTri(e0Far, common01, e1Far, region);
|
||||
}
|
||||
|
||||
// Construct patch names
|
||||
setDefaultPatches();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -1,359 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Description
|
||||
Nastran surface reader.
|
||||
|
||||
- Uses the Ansa "$ANSA_NAME" or the Hypermesh "$HMNAME COMP" extensions
|
||||
to obtain patch names.
|
||||
- Handles Nastran short, long, and comma-separated free formats.
|
||||
- Properly handles the Nastran compact floating point notation: \n
|
||||
\verbatim
|
||||
GRID 28 10.20269-.030265-2.358-8
|
||||
\endverbatim
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
#include "NASCore.H"
|
||||
#include "IFstream.H"
|
||||
#include "StringStream.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
// Do weird things to extract number
|
||||
static inline scalar readNasScalar(const string& s)
|
||||
{
|
||||
return Foam::fileFormats::NASCore::readNasScalar(s);
|
||||
}
|
||||
|
||||
|
||||
// Read a column of a given width from either a fixed-format NAS file, or a
|
||||
// comma-separated free-format NAS file
|
||||
static std::string readNASToken
|
||||
(
|
||||
const string& line,
|
||||
const size_t& width,
|
||||
size_t& index
|
||||
)
|
||||
{
|
||||
size_t indexStart = index;
|
||||
size_t indexEnd = line.find(',', indexStart);
|
||||
index = indexEnd + 1;
|
||||
|
||||
if (indexEnd == std::string::npos)
|
||||
{
|
||||
indexEnd = indexStart + width;
|
||||
index = indexEnd;
|
||||
}
|
||||
|
||||
return line.substr(indexStart, indexEnd - indexStart);
|
||||
}
|
||||
|
||||
|
||||
bool triSurface::readNAS(const fileName& fName)
|
||||
{
|
||||
IFstream is(fName);
|
||||
|
||||
if (!is.good())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Cannot read file " << fName
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
// coordinates of point
|
||||
DynamicList<point> points;
|
||||
// Nastran index of point
|
||||
DynamicList<label> indices;
|
||||
// Faces in terms of Nastran point indices
|
||||
DynamicList<labelledTri> faces;
|
||||
// From face group to patch
|
||||
Map<label> groupToPatch;
|
||||
label nPatches = 0;
|
||||
// Name for face group
|
||||
Map<word> groupToName;
|
||||
|
||||
// Ansa tags. Denoted by $ANSA_NAME. These will appear just before the
|
||||
// first use of a type. We read them and store the pshell types which
|
||||
// are used to name the patches.
|
||||
label ansaId = -1;
|
||||
word ansaType;
|
||||
string ansaName;
|
||||
|
||||
// A single warning per unrecognized command
|
||||
HashSet<word> unhandledCmd;
|
||||
|
||||
while (is.good())
|
||||
{
|
||||
size_t linei = 0;
|
||||
string line;
|
||||
is.getLine(line);
|
||||
|
||||
// ANSA extension
|
||||
if (line.startsWith("$ANSA_NAME"))
|
||||
{
|
||||
const auto sem0 = line.find(';', 0);
|
||||
const auto sem1 = line.find(';', sem0+1);
|
||||
const auto sem2 = line.find(';', sem1+1);
|
||||
|
||||
if
|
||||
(
|
||||
sem0 != string::npos
|
||||
&& sem1 != string::npos
|
||||
&& sem2 != string::npos
|
||||
)
|
||||
{
|
||||
ansaId = readLabel(line.substr(sem0+1, sem1-sem0-1));
|
||||
ansaType = line.substr(sem1+1, sem2-sem1-1);
|
||||
|
||||
string nameString;
|
||||
is.getLine(ansaName);
|
||||
|
||||
ansaName.removeEnd("\r"); // Possible CR-NL
|
||||
|
||||
ansaName = ansaName.substr(1);
|
||||
// Info<< "ANSA tag for NastranID:" << ansaId
|
||||
// << " of type " << ansaType
|
||||
// << " name " << ansaName << endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Hypermesh extension
|
||||
// $HMNAME COMP 1"partName"
|
||||
if (line.startsWith("$HMNAME COMP") && line.find('"') != string::npos)
|
||||
{
|
||||
label groupId = readLabel(line.substr(16, 16));
|
||||
IStringStream lineStream(line.substr(32));
|
||||
|
||||
string rawName;
|
||||
lineStream >> rawName;
|
||||
|
||||
const word groupName = word::validate(rawName);
|
||||
groupToName.insert(groupId, groupName);
|
||||
Info<< "group " << groupId << " => " << groupName << endl;
|
||||
}
|
||||
|
||||
|
||||
if (line.empty() || line[0] == '$')
|
||||
{
|
||||
// Skip empty or comment
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if character 72 is continuation
|
||||
if (line.size() > 72 && line[72] == '+')
|
||||
{
|
||||
line.resize(72);
|
||||
|
||||
while (true)
|
||||
{
|
||||
string buf;
|
||||
is.getLine(buf);
|
||||
|
||||
if (buf.size() > 72 && buf[72] == '+')
|
||||
{
|
||||
line += buf.substr(8, 64);
|
||||
}
|
||||
else
|
||||
{
|
||||
line += buf.substr(8);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Read first word
|
||||
word cmd(IStringStream(readNASToken(line, 8, linei))());
|
||||
|
||||
if (cmd == "CTRIA3")
|
||||
{
|
||||
readNASToken(line, 8, linei);
|
||||
label groupId = readLabel(readNASToken(line, 8, linei));
|
||||
label a = readLabel(readNASToken(line, 8, linei));
|
||||
label b = readLabel(readNASToken(line, 8, linei));
|
||||
label c = readLabel(readNASToken(line, 8, linei));
|
||||
|
||||
// Convert group into patch
|
||||
Map<label>::const_iterator iter = groupToPatch.find(groupId);
|
||||
|
||||
label patchi;
|
||||
if (iter == groupToPatch.end())
|
||||
{
|
||||
patchi = nPatches++;
|
||||
groupToPatch.insert(groupId, patchi);
|
||||
Info<< "patch " << patchi << " => group " << groupId << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
patchi = iter();
|
||||
}
|
||||
|
||||
faces.append(labelledTri(a, b, c, patchi));
|
||||
}
|
||||
else if (cmd == "CQUAD4")
|
||||
{
|
||||
readNASToken(line, 8, linei);
|
||||
label groupId = readLabel(readNASToken(line, 8, linei));
|
||||
label a = readLabel(readNASToken(line, 8, linei));
|
||||
label b = readLabel(readNASToken(line, 8, linei));
|
||||
label c = readLabel(readNASToken(line, 8, linei));
|
||||
label d = readLabel(readNASToken(line, 8, linei));
|
||||
|
||||
// Convert group into patch
|
||||
Map<label>::const_iterator iter = groupToPatch.find(groupId);
|
||||
|
||||
label patchi;
|
||||
if (iter == groupToPatch.end())
|
||||
{
|
||||
patchi = nPatches++;
|
||||
groupToPatch.insert(groupId, patchi);
|
||||
Info<< "patch " << patchi << " => group " << groupId << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
patchi = iter();
|
||||
}
|
||||
|
||||
faces.append(labelledTri(a, b, c, patchi));
|
||||
faces.append(labelledTri(c, d, a, patchi));
|
||||
}
|
||||
else if (cmd == "PSHELL")
|
||||
{
|
||||
// Read shell type since group gives patchnames
|
||||
label groupId = readLabel(readNASToken(line, 8, linei));
|
||||
if (groupId == ansaId && ansaType == "PSHELL")
|
||||
{
|
||||
const word groupName = word::validate(ansaName);
|
||||
groupToName.insert(groupId, groupName);
|
||||
Info<< "group " << groupId << " => " << groupName << endl;
|
||||
}
|
||||
}
|
||||
else if (cmd == "GRID")
|
||||
{
|
||||
label index = readLabel(readNASToken(line, 8, linei));
|
||||
readNASToken(line, 8, linei);
|
||||
scalar x = readNasScalar(readNASToken(line, 8, linei));
|
||||
scalar y = readNasScalar(readNASToken(line, 8, linei));
|
||||
scalar z = readNasScalar(readNASToken(line, 8, linei));
|
||||
|
||||
indices.append(index);
|
||||
points.append(point(x, y, z));
|
||||
}
|
||||
else if (cmd == "GRID*")
|
||||
{
|
||||
// Long format is on two lines with '*' continuation symbol
|
||||
// on start of second line.
|
||||
// Typical line (spaces compacted)
|
||||
// GRID* 126 0 -5.55999875E+02 -5.68730474E+02
|
||||
// * 2.14897901E+02
|
||||
label index = readLabel(readNASToken(line, 16, linei));
|
||||
readNASToken(line, 16, linei);
|
||||
scalar x = readNasScalar(readNASToken(line, 16, linei));
|
||||
scalar y = readNasScalar(readNASToken(line, 16, linei));
|
||||
|
||||
linei = 0;
|
||||
is.getLine(line);
|
||||
if (line[0] != '*')
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Expected continuation symbol '*' when reading GRID*"
|
||||
<< " (double precision coordinate) output" << nl
|
||||
<< "Read:" << line << nl
|
||||
<< "File:" << is.name()
|
||||
<< " line:" << is.lineNumber()
|
||||
<< exit(FatalError);
|
||||
}
|
||||
readNASToken(line, 8, linei);
|
||||
scalar z = readNasScalar(readNASToken(line, 16, linei));
|
||||
|
||||
indices.append(index);
|
||||
points.append(point(x, y, z));
|
||||
}
|
||||
else if (unhandledCmd.insert(cmd))
|
||||
{
|
||||
Info<< "Unhandled Nastran command " << line << nl
|
||||
<< "File:" << is.name() << " line:" << is.lineNumber() << endl;
|
||||
}
|
||||
}
|
||||
|
||||
points.shrink();
|
||||
indices.shrink();
|
||||
faces.shrink();
|
||||
|
||||
|
||||
Info<< "Read triangles:" << faces.size() << " points:" << points.size()
|
||||
<< endl;
|
||||
|
||||
{
|
||||
// Build inverse mapping (index to point)
|
||||
Map<label> indexToPoint(2*indices.size());
|
||||
forAll(indices, i)
|
||||
{
|
||||
indexToPoint.insert(indices[i], i);
|
||||
}
|
||||
|
||||
// Relabel faces
|
||||
forAll(faces, i)
|
||||
{
|
||||
labelledTri& f = faces[i];
|
||||
|
||||
f[0] = indexToPoint[f[0]];
|
||||
f[1] = indexToPoint[f[1]];
|
||||
f[2] = indexToPoint[f[2]];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Convert groupToPatch to patchList.
|
||||
geometricSurfacePatchList patches(nPatches);
|
||||
|
||||
forAllConstIters(groupToName, iter)
|
||||
{
|
||||
const label patchIdx = groupToPatch[iter.key()];
|
||||
patches[patchIdx] = geometricSurfacePatch(iter.object(), patchIdx);
|
||||
}
|
||||
|
||||
Info<< "patches:" << patches << endl;
|
||||
|
||||
// Transfer DynamicLists to straight ones.
|
||||
pointField allPoints(points.xfer());
|
||||
|
||||
// Create triSurface
|
||||
*this = triSurface(faces, patches, allPoints, true);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -1,199 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||
\\/ 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
#include "IFstream.H"
|
||||
#include "StringStream.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
bool Foam::triSurface::readOBJ(const fileName& OBJfileName)
|
||||
{
|
||||
IFstream OBJfile(OBJfileName);
|
||||
|
||||
if (!OBJfile.good())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Cannot read file " << OBJfileName
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
DynamicList<point> points;
|
||||
DynamicList<labelledTri> faces;
|
||||
HashTable<label> groupToPatch;
|
||||
|
||||
label groupID = 0;
|
||||
label maxGroupID = 0;
|
||||
|
||||
while (OBJfile.good())
|
||||
{
|
||||
string line = getLineNoComment(OBJfile);
|
||||
|
||||
if (line.size())
|
||||
{
|
||||
if (line.removeEnd("\\"))
|
||||
{
|
||||
line += getLineNoComment(OBJfile);
|
||||
}
|
||||
|
||||
// Read first word
|
||||
IStringStream lineStream(line);
|
||||
word cmd;
|
||||
lineStream >> cmd;
|
||||
|
||||
if (cmd == "v")
|
||||
{
|
||||
scalar x, y, z;
|
||||
|
||||
lineStream >> x >> y >> z;
|
||||
|
||||
points.append(point(x, y, z));
|
||||
}
|
||||
else if (cmd == "g")
|
||||
{
|
||||
word group;
|
||||
|
||||
lineStream >> group;
|
||||
|
||||
HashTable<label>::const_iterator findGroup =
|
||||
groupToPatch.find(group);
|
||||
|
||||
if (findGroup != groupToPatch.end())
|
||||
{
|
||||
groupID = findGroup();
|
||||
}
|
||||
else
|
||||
{
|
||||
groupID = maxGroupID;
|
||||
|
||||
groupToPatch.insert(group, groupID);
|
||||
|
||||
maxGroupID++;
|
||||
}
|
||||
}
|
||||
else if (cmd == "f")
|
||||
{
|
||||
DynamicList<label> verts;
|
||||
|
||||
// Assume 'f' is followed by space.
|
||||
string::size_type endNum = 1;
|
||||
|
||||
while (true)
|
||||
{
|
||||
string::size_type startNum =
|
||||
line.find_first_not_of(" \r", endNum);
|
||||
|
||||
if (startNum == string::npos)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
endNum = line.find(' ', startNum);
|
||||
|
||||
string vertexSpec;
|
||||
if (endNum != string::npos)
|
||||
{
|
||||
vertexSpec = line.substr(startNum, endNum-startNum);
|
||||
}
|
||||
else
|
||||
{
|
||||
vertexSpec = line.substr
|
||||
(
|
||||
startNum,
|
||||
line.size() - startNum
|
||||
);
|
||||
}
|
||||
|
||||
string::size_type slashPos = vertexSpec.find('/');
|
||||
|
||||
label vertI = 0;
|
||||
if (slashPos != string::npos)
|
||||
{
|
||||
IStringStream intStream(vertexSpec.substr(0, slashPos));
|
||||
|
||||
intStream >> vertI;
|
||||
}
|
||||
else
|
||||
{
|
||||
IStringStream intStream(vertexSpec);
|
||||
|
||||
intStream >> vertI;
|
||||
}
|
||||
verts.append(vertI - 1);
|
||||
}
|
||||
|
||||
verts.shrink();
|
||||
|
||||
// Do simple face triangulation around f[0].
|
||||
// Cannot use face::triangulation since no complete points yet.
|
||||
for (label fp = 1; fp < verts.size() - 1; fp++)
|
||||
{
|
||||
label fp1 = verts.fcIndex(fp);
|
||||
|
||||
labelledTri tri(verts[0], verts[fp], verts[fp1], groupID);
|
||||
|
||||
faces.append(tri);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
points.shrink();
|
||||
faces.shrink();
|
||||
|
||||
// Convert groupToPatch to patchList.
|
||||
geometricSurfacePatchList patches(maxGroupID);
|
||||
|
||||
if (maxGroupID == 0)
|
||||
{
|
||||
// Add single (default) patch
|
||||
patches = { geometricSurfacePatch("patch0", 0) };
|
||||
}
|
||||
else
|
||||
{
|
||||
forAllConstIters(groupToPatch, iter)
|
||||
{
|
||||
const label patchIdx = iter.object();
|
||||
|
||||
patches[patchIdx] = geometricSurfacePatch
|
||||
(
|
||||
iter.key(),
|
||||
patchIdx
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Transfer DynamicLists to straight ones.
|
||||
pointField allPoints(points.xfer());
|
||||
|
||||
// Create triSurface
|
||||
*this = triSurface(faces, patches, allPoints, true);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -1,140 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Description
|
||||
Lightwave OBJ format.
|
||||
|
||||
Note: Java obj loader does not support '#' on line
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void triSurface::writeOBJ(const bool writeSorted, Ostream& os) const
|
||||
{
|
||||
// Write header
|
||||
os << "# Wavefront OBJ file" << nl
|
||||
<< "# Regions:" << nl;
|
||||
|
||||
labelList faceMap;
|
||||
|
||||
surfacePatchList patches(calcPatches(faceMap));
|
||||
|
||||
const pointField& ps = points();
|
||||
|
||||
// Print patch names as comment
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
os << "# " << patchi << " "
|
||||
<< patches[patchi].name() << nl;
|
||||
}
|
||||
os << "#" << nl;
|
||||
|
||||
os << "# points : " << ps.size() << nl
|
||||
<< "# triangles : " << size() << nl
|
||||
<< "#" << nl;
|
||||
|
||||
|
||||
// Write vertex coords
|
||||
forAll(ps, pointi)
|
||||
{
|
||||
os << "v "
|
||||
<< ps[pointi].x() << ' '
|
||||
<< ps[pointi].y() << ' '
|
||||
<< ps[pointi].z() << nl;
|
||||
}
|
||||
|
||||
if (writeSorted)
|
||||
{
|
||||
label faceIndex = 0;
|
||||
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
// Print all faces belonging to this patch
|
||||
|
||||
os << "g " << patches[patchi].name() << nl;
|
||||
|
||||
for
|
||||
(
|
||||
label patchFacei = 0;
|
||||
patchFacei < patches[patchi].size();
|
||||
patchFacei++
|
||||
)
|
||||
{
|
||||
const label facei = faceMap[faceIndex++];
|
||||
|
||||
os << "f "
|
||||
<< operator[](facei)[0] + 1 << ' '
|
||||
<< operator[](facei)[1] + 1 << ' '
|
||||
<< operator[](facei)[2] + 1
|
||||
//<< " # " << operator[](facei).region()
|
||||
<< nl;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get patch (=compact region) per face
|
||||
labelList patchIDs(size());
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
label facei = patches[patchi].start();
|
||||
|
||||
forAll(patches[patchi], i)
|
||||
{
|
||||
patchIDs[faceMap[facei++]] = patchi;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
label prevPatchi = -1;
|
||||
|
||||
forAll(*this, facei)
|
||||
{
|
||||
if (prevPatchi != patchIDs[facei])
|
||||
{
|
||||
prevPatchi = patchIDs[facei];
|
||||
os << "g " << patches[patchIDs[facei]].name() << nl;
|
||||
}
|
||||
os << "f "
|
||||
<< operator[](facei)[0] + 1 << ' '
|
||||
<< operator[](facei)[1] + 1 << ' '
|
||||
<< operator[](facei)[2] + 1
|
||||
<< nl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -1,134 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Description
|
||||
Geomview OFF polyList format. Does triangulation.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
#include "IFstream.H"
|
||||
#include "StringStream.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
bool Foam::triSurface::readOFF(const fileName& OFFfileName)
|
||||
{
|
||||
IFstream OFFfile(OFFfileName);
|
||||
|
||||
if (!OFFfile.good())
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Cannot read file " << OFFfileName
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
// Read header
|
||||
string hdr = getLineNoComment(OFFfile);
|
||||
if (hdr != "OFF")
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "OFF file " << OFFfileName
|
||||
<< " does not start with 'OFF'"
|
||||
<< exit(FatalError);
|
||||
}
|
||||
|
||||
|
||||
label nPoints, nEdges, nElems;
|
||||
|
||||
string line = getLineNoComment(OFFfile);
|
||||
{
|
||||
IStringStream lineStream(line);
|
||||
lineStream >> nPoints >> nElems >> nEdges;
|
||||
}
|
||||
|
||||
// Read points
|
||||
pointField points(nPoints);
|
||||
|
||||
forAll(points, pointi)
|
||||
{
|
||||
scalar x, y, z;
|
||||
line = getLineNoComment(OFFfile);
|
||||
{
|
||||
IStringStream lineStream(line);
|
||||
lineStream >> x >> y >> z;
|
||||
}
|
||||
points[pointi] = point(x, y, z);
|
||||
}
|
||||
|
||||
// Read faces & triangulate them,
|
||||
DynamicList<labelledTri> tris(nElems);
|
||||
|
||||
for (label facei = 0; facei < nElems; facei++)
|
||||
{
|
||||
line = getLineNoComment(OFFfile);
|
||||
{
|
||||
IStringStream lineStream(line);
|
||||
|
||||
label nVerts;
|
||||
lineStream >> nVerts;
|
||||
|
||||
face f(nVerts);
|
||||
|
||||
forAll(f, fp)
|
||||
{
|
||||
lineStream >> f[fp];
|
||||
}
|
||||
|
||||
// Triangulate.
|
||||
if (nVerts == 3)
|
||||
{
|
||||
tris.append(labelledTri(f[0], f[1], f[2], 0));
|
||||
}
|
||||
else if (nVerts == 4)
|
||||
{
|
||||
tris.append(labelledTri(f[0], f[1], f[2], 0));
|
||||
tris.append(labelledTri(f[2], f[3], f[0], 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
faceList triFaces(f.nTriangles(points));
|
||||
|
||||
label nTri = 0;
|
||||
|
||||
f.triangles(points, nTri, triFaces);
|
||||
|
||||
forAll(triFaces, triFacei)
|
||||
{
|
||||
const face& f = triFaces[triFacei];
|
||||
|
||||
tris.append(labelledTri(f[0], f[1], f[2], 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tris.shrink();
|
||||
|
||||
*this = triSurface(tris, points);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -1,116 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void triSurface::writeOFF(const bool writeSorted, Ostream& os) const
|
||||
{
|
||||
// Write header
|
||||
os << "OFF" << endl
|
||||
<< "# Geomview OFF file" << endl
|
||||
<< "# Regions:" << endl;
|
||||
|
||||
labelList faceMap;
|
||||
surfacePatchList patches(calcPatches(faceMap));
|
||||
|
||||
// Print patch names as comment
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
os << "# " << patchi << " "
|
||||
<< patches[patchi].name() << endl;
|
||||
}
|
||||
os << nl << endl;
|
||||
|
||||
const pointField& ps = points();
|
||||
|
||||
os << "# nPoints nTriangles nEdges" << endl
|
||||
<< ps.size()
|
||||
<< ' ' << size()
|
||||
<< ' ' << nEdges()
|
||||
<< nl << endl;
|
||||
|
||||
// Write vertex coords
|
||||
forAll(ps, pointi)
|
||||
{
|
||||
os << ps[pointi].x() << ' '
|
||||
<< ps[pointi].y() << ' '
|
||||
<< ps[pointi].z() << " #" << pointi << endl;
|
||||
}
|
||||
|
||||
os << endl;
|
||||
|
||||
if (writeSorted)
|
||||
{
|
||||
label faceIndex = 0;
|
||||
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
// Print all faces belonging to this patch
|
||||
|
||||
for
|
||||
(
|
||||
label patchFacei = 0;
|
||||
patchFacei < patches[patchi].size();
|
||||
patchFacei++
|
||||
)
|
||||
{
|
||||
const label facei = faceMap[faceIndex++];
|
||||
|
||||
os << "3 "
|
||||
<< operator[](facei)[0] << ' '
|
||||
<< operator[](facei)[1] << ' '
|
||||
<< operator[](facei)[2] << ' '
|
||||
<< operator[](facei).region()
|
||||
<< endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
forAll(*this, facei)
|
||||
{
|
||||
os << "3 "
|
||||
<< operator[](facei)[0] << ' '
|
||||
<< operator[](facei)[1] << ' '
|
||||
<< operator[](facei)[2] << ' '
|
||||
<< operator[](facei).region()
|
||||
<< endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -1,111 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "triSurface.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void triSurface::writeSMESH(const bool writeSorted, Ostream& os) const
|
||||
{
|
||||
const pointField& ps = points();
|
||||
|
||||
// Write header
|
||||
os << "# tetgen .smesh file" << endl
|
||||
<< ps.size() << " 3" << endl; // 3 dimensions
|
||||
|
||||
// Write vertex coords
|
||||
forAll(ps, pointi)
|
||||
{
|
||||
os << pointi << ' '
|
||||
<< ps[pointi].x() << ' '
|
||||
<< ps[pointi].y() << ' '
|
||||
<< ps[pointi].z() << endl;
|
||||
}
|
||||
|
||||
if (writeSorted)
|
||||
{
|
||||
labelList faceMap;
|
||||
|
||||
surfacePatchList patches(calcPatches(faceMap));
|
||||
|
||||
os << size() << " 1" << endl; // 1 attribute: region number
|
||||
|
||||
label faceIndex = 0;
|
||||
|
||||
forAll(patches, patchi)
|
||||
{
|
||||
// Print all faces belonging to this patch
|
||||
|
||||
for
|
||||
(
|
||||
label patchFacei = 0;
|
||||
patchFacei < patches[patchi].size();
|
||||
patchFacei++
|
||||
)
|
||||
{
|
||||
const label facei = faceMap[faceIndex++];
|
||||
|
||||
os << "3 " // triangles
|
||||
<< operator[](facei)[0] << ' '
|
||||
<< operator[](facei)[1] << ' '
|
||||
<< operator[](facei)[2] << ' '
|
||||
<< operator[](facei).region() // region number
|
||||
<< endl;
|
||||
}
|
||||
}
|
||||
|
||||
os << '0' << endl // holes
|
||||
<< '0' << endl; // regions
|
||||
}
|
||||
else
|
||||
{
|
||||
os << size() << " 1" << endl; // 1 attribute: region number
|
||||
|
||||
forAll(*this, facei)
|
||||
{
|
||||
os << "3 "
|
||||
<< operator[](facei)[0] << ' '
|
||||
<< operator[](facei)[1] << ' '
|
||||
<< operator[](facei)[2] << ' '
|
||||
<< operator[](facei).region() // region number
|
||||
<< endl;
|
||||
}
|
||||
|
||||
os << '0' << endl // holes
|
||||
<< '0' << endl; // regions
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -1,92 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2017 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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "STLReader.H"
|
||||
#include "triSurface.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
bool Foam::triSurface::readSTL(const fileName& STLfileName, bool forceBinary)
|
||||
{
|
||||
// Read in the values
|
||||
fileFormats::STLReader reader
|
||||
(
|
||||
STLfileName,
|
||||
(
|
||||
forceBinary
|
||||
? fileFormats::STLCore::BINARY
|
||||
: fileFormats::STLCore::UNKNOWN
|
||||
)
|
||||
);
|
||||
|
||||
// Get the map for stitched surface points, with merge tolerance depending
|
||||
// on the input format
|
||||
labelList pointMap;
|
||||
const label nUniquePoints = reader.mergePointsMap(pointMap);
|
||||
|
||||
const auto& readpts = reader.points();
|
||||
const labelList& zoneIds = reader.zoneIds();
|
||||
|
||||
pointField& pointLst = storedPoints();
|
||||
List<Face>& faceLst = storedFaces();
|
||||
|
||||
// Sizing
|
||||
pointLst.setSize(nUniquePoints);
|
||||
faceLst.setSize(zoneIds.size());
|
||||
|
||||
// Assign points
|
||||
forAll(readpts, pointi)
|
||||
{
|
||||
pointLst[pointMap[pointi]] = readpts[pointi];
|
||||
}
|
||||
|
||||
// Assign triangles
|
||||
label pointi = 0;
|
||||
forAll(faceLst, i)
|
||||
{
|
||||
Face& f = faceLst[i];
|
||||
|
||||
f[0] = pointMap[pointi++];
|
||||
f[1] = pointMap[pointi++];
|
||||
f[2] = pointMap[pointi++];
|
||||
f.region() = zoneIds[i];
|
||||
}
|
||||
|
||||
// Set patch name/index.
|
||||
if (reader.stlFormat() == fileFormats::STLCore::ASCII)
|
||||
{
|
||||
const List<word>& names = reader.names();
|
||||
|
||||
patches_.setSize(names.size());
|
||||
forAll(patches_, patchi)
|
||||
{
|
||||
patches_[patchi] = geometricSurfacePatch(names[patchi], patchi);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// ************************************************************************* //
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user