diff --git a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C
index b0d3d83ec0..6d83d18363 100644
--- a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C
+++ b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C
@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
- \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd.
+ \\ / A nd | Copyright (C) 2004-2011 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@@ -36,6 +36,7 @@ Description
#include "Time.H"
#include "surfaceFeatures.H"
#include "featureEdgeMesh.H"
+#include "extendedFeatureEdgeMesh.H"
#include "treeBoundBox.H"
#include "meshTools.H"
#include "OFstream.H"
@@ -298,20 +299,46 @@ int main(int argc, char *argv[])
// Extracting and writing a featureEdgeMesh
- Pout<< nl << "Writing featureEdgeMesh to constant/featureEdgeMesh."
- << endl;
-
- featureEdgeMesh feMesh
+ extendedFeatureEdgeMesh feMesh
(
newSet,
runTime,
surfFileName.lessExt().name() + ".featureEdgeMesh"
);
+ Info<< nl << "Writing extendedFeatureEdgeMesh to " << feMesh.objectPath()
+ << endl;
+
+
feMesh.writeObj(surfFileName.lessExt().name());
feMesh.write();
+
+ // Write a featureEdgeMesh for backwards compatibility
+ {
+ featureEdgeMesh bfeMesh
+ (
+ IOobject
+ (
+ surfFileName.lessExt().name() + ".eMesh", // name
+ runTime.constant(), // instance
+ "triSurface",
+ runTime, // registry
+ IOobject::NO_READ,
+ IOobject::AUTO_WRITE,
+ false
+ ),
+ feMesh.points(),
+ feMesh.edges()
+ );
+
+ Info<< nl << "Writing featureEdgeMesh to "
+ << bfeMesh.objectPath() << endl;
+
+ bfeMesh.regIOobject::write();
+ }
+
Info<< "End\n" << endl;
return 0;
diff --git a/src/edgeMesh/Make/files b/src/edgeMesh/Make/files
index cdad239999..52f985de8c 100644
--- a/src/edgeMesh/Make/files
+++ b/src/edgeMesh/Make/files
@@ -20,7 +20,10 @@ $(edgeFormats)/starcd/STARCDedgeFormatRunTime.C
$(edgeFormats)/vtk/VTKedgeFormat.C
$(edgeFormats)/vtk/VTKedgeFormatRunTime.C
+extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C
+
featureEdgeMesh/featureEdgeMesh.C
+
LIB = $(FOAM_LIBBIN)/libedgeMesh
diff --git a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C
new file mode 100644
index 0000000000..c4f536e209
--- /dev/null
+++ b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C
@@ -0,0 +1,1028 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2004-2011 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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "extendedFeatureEdgeMesh.H"
+#include "triSurface.H"
+#include "Random.H"
+#include "Time.H"
+#include "meshTools.H"
+#include "linePointRef.H"
+#include "ListListOps.H"
+#include "OFstream.H"
+#include "IFstream.H"
+#include "unitConversion.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(Foam::extendedFeatureEdgeMesh, 0);
+
+Foam::scalar Foam::extendedFeatureEdgeMesh::cosNormalAngleTol_ =
+ Foam::cos(degToRad(0.1));
+
+
+Foam::label Foam::extendedFeatureEdgeMesh::convexStart_ = 0;
+
+
+Foam::label Foam::extendedFeatureEdgeMesh::externalStart_ = 0;
+
+
+Foam::label Foam::extendedFeatureEdgeMesh::nPointTypes = 4;
+
+
+Foam::label Foam::extendedFeatureEdgeMesh::nEdgeTypes = 5;
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh(const IOobject& io)
+:
+ regIOobject(io),
+ edgeMesh(pointField(0), edgeList(0)),
+ concaveStart_(0),
+ mixedStart_(0),
+ nonFeatureStart_(0),
+ internalStart_(0),
+ flatStart_(0),
+ openStart_(0),
+ multipleStart_(0),
+ normals_(0),
+ edgeDirections_(0),
+ edgeNormals_(0),
+ featurePointNormals_(0),
+ regionEdges_(0),
+ edgeTree_(),
+ edgeTreesByType_()
+{
+ if
+ (
+ io.readOpt() == IOobject::MUST_READ
+ || io.readOpt() == IOobject::MUST_READ_IF_MODIFIED
+ || (io.readOpt() == IOobject::READ_IF_PRESENT && headerOk())
+ )
+ {
+ if (readOpt() == IOobject::MUST_READ_IF_MODIFIED)
+ {
+ WarningIn
+ (
+ "extendedFeatureEdgeMesh::extendedFeatureEdgeMesh"
+ "(const IOobject&)"
+ ) << "Specified IOobject::MUST_READ_IF_MODIFIED but class"
+ << " does not support automatic rereading."
+ << endl;
+ }
+
+ Istream& is = readStream(typeName);
+
+ is >> *this
+ >> concaveStart_
+ >> mixedStart_
+ >> nonFeatureStart_
+ >> internalStart_
+ >> flatStart_
+ >> openStart_
+ >> multipleStart_
+ >> normals_
+ >> edgeNormals_
+ >> featurePointNormals_
+ >> regionEdges_;
+
+ close();
+
+ {
+ // Calculate edgeDirections
+
+ const edgeList& eds(edges());
+
+ const pointField& pts(points());
+
+ edgeDirections_.setSize(eds.size());
+
+ forAll(eds, eI)
+ {
+ edgeDirections_[eI] = eds[eI].vec(pts);
+ }
+
+ edgeDirections_ /= mag(edgeDirections_);
+ }
+ }
+
+ if (debug)
+ {
+ Pout<< "extendedFeatureEdgeMesh::extendedFeatureEdgeMesh :"
+ << " constructed from IOobject :"
+ << " points:" << points().size()
+ << " edges:" << edges().size()
+ << endl;
+ }
+}
+
+
+Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh
+(
+ const IOobject& io,
+ const extendedFeatureEdgeMesh& fem
+)
+:
+ regIOobject(io),
+ edgeMesh(fem),
+ concaveStart_(fem.concaveStart()),
+ mixedStart_(fem.mixedStart()),
+ nonFeatureStart_(fem.nonFeatureStart()),
+ internalStart_(fem.internalStart()),
+ flatStart_(fem.flatStart()),
+ openStart_(fem.openStart()),
+ multipleStart_(fem.multipleStart()),
+ normals_(fem.normals()),
+ edgeDirections_(fem.edgeDirections()),
+ edgeNormals_(fem.edgeNormals()),
+ featurePointNormals_(fem.featurePointNormals()),
+ regionEdges_(fem.regionEdges()),
+ edgeTree_(),
+ edgeTreesByType_()
+{}
+
+
+Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh
+(
+ const IOobject& io,
+ const Xfer& pointLst,
+ const Xfer& edgeLst
+)
+:
+ regIOobject(io),
+ edgeMesh(pointLst, edgeLst),
+ concaveStart_(0),
+ mixedStart_(0),
+ nonFeatureStart_(0),
+ internalStart_(0),
+ flatStart_(0),
+ openStart_(0),
+ multipleStart_(0),
+ normals_(0),
+ edgeDirections_(0),
+ edgeNormals_(0),
+ featurePointNormals_(0),
+ regionEdges_(0),
+ edgeTree_(),
+ edgeTreesByType_()
+{}
+
+
+Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh
+(
+ const surfaceFeatures& sFeat,
+ const objectRegistry& obr,
+ const fileName& sFeatFileName
+)
+:
+ regIOobject
+ (
+ IOobject
+ (
+ sFeatFileName,
+ obr.time().constant(),
+ "extendedFeatureEdgeMesh",
+ obr,
+ IOobject::NO_READ,
+ IOobject::NO_WRITE
+ )
+ ),
+ edgeMesh(pointField(0), edgeList(0)),
+ concaveStart_(-1),
+ mixedStart_(-1),
+ nonFeatureStart_(-1),
+ internalStart_(-1),
+ flatStart_(-1),
+ openStart_(-1),
+ multipleStart_(-1),
+ normals_(0),
+ edgeDirections_(0),
+ edgeNormals_(0),
+ featurePointNormals_(0),
+ regionEdges_(0),
+ edgeTree_(),
+ edgeTreesByType_()
+{
+ // Extract and reorder the data from surfaceFeatures
+
+ // References to the surfaceFeatures data
+ const triSurface& surf(sFeat.surface());
+ const pointField& sFeatLocalPts(surf.localPoints());
+ const edgeList& sFeatEds(surf.edges());
+
+ // Filling the extendedFeatureEdgeMesh with the raw geometrical data.
+
+ label nFeatEds = sFeat.featureEdges().size();
+
+ DynamicList tmpPts;
+ edgeList eds(nFeatEds);
+ DynamicList norms;
+ vectorField edgeDirections(nFeatEds);
+ labelListList edgeNormals(nFeatEds);
+ DynamicList