diff --git a/applications/utilities/surface/surfaceFeatureExtract/Make/options b/applications/utilities/surface/surfaceFeatureExtract/Make/options index 02e49d32c6..f87dafaa5d 100644 --- a/applications/utilities/surface/surfaceFeatureExtract/Make/options +++ b/applications/utilities/surface/surfaceFeatureExtract/Make/options @@ -1,8 +1,9 @@ EXE_INC = \ - -I$(LIB_SRC)/cfdTools/general/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/edgeMesh/lnInclude \ -I$(LIB_SRC)/triSurface/lnInclude EXE_LIBS = \ -lmeshTools \ + -ledgeMesh \ -ltriSurface diff --git a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C index 83d84b92c8..7ba05f9d0e 100644 --- a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C +++ b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C @@ -29,10 +29,13 @@ Description \*---------------------------------------------------------------------------*/ + #include "triangle.H" #include "triSurface.H" #include "argList.H" +#include "Time.H" #include "surfaceFeatures.H" +#include "featureEdgeMesh.H" #include "treeBoundBox.H" #include "meshTools.H" #include "OFstream.H" @@ -135,7 +138,8 @@ int main(int argc, char *argv[]) "remove edges within specified bounding box" ); - argList args(argc, argv); +# include "setRootCase.H" +# include "createTime.H" Info<< "Feature line extraction is only valid on closed manifold surfaces." << endl; @@ -282,7 +286,6 @@ int main(int argc, char *argv[]) Info<< endl << "Writing edge objs." << endl; newSet.writeObj("final"); - Info<< nl << "Final feature set:" << nl << " feature points : " << newSet.featurePoints().size() << nl @@ -293,6 +296,22 @@ int main(int argc, char *argv[]) << " internal edges : " << newSet.nInternalEdges() << nl << endl; + // Extracting and writing a featureEdgeMesh + + Pout<< nl << "Writing featureEdgeMesh to constant/featureEdgeMesh." + << endl; + + featureEdgeMesh feMesh + ( + newSet, + runTime, + surfFileName.lessExt().name() + ".featureEdgeMesh" + ); + + feMesh.writeObj(surfFileName.lessExt().name()); + + feMesh.write(); + Info<< "End\n" << endl; return 0; diff --git a/src/edgeMesh/Make/options b/src/edgeMesh/Make/options index 7e207d0dbe..4796c18e22 100644 --- a/src/edgeMesh/Make/options +++ b/src/edgeMesh/Make/options @@ -1,5 +1,9 @@ EXE_INC = \ - -I$(LIB_SRC)/fileFormats/lnInclude + -I$(LIB_SRC)/fileFormats/lnInclude \ + -I$(LIB_SRC)/triSurface/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude LIB_LIBS = \ + -ltriSurface \ + -lmeshTools \ -lfileFormats diff --git a/src/edgeMesh/edgeMesh.C b/src/edgeMesh/edgeMesh.C index d5c8f12ef8..7dd7015144 100644 --- a/src/edgeMesh/edgeMesh.C +++ b/src/edgeMesh/edgeMesh.C @@ -387,14 +387,4 @@ void Foam::edgeMesh::mergePoints(const scalar mergeDist) } -// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // - -void Foam::edgeMesh::operator=(const edgeMesh& rhs) -{ - points_ = rhs.points_; - edges_ = rhs.edges_; - pointEdgesPtr_.clear(); -} - - // ************************************************************************* // diff --git a/src/edgeMesh/edgeMeshI.H b/src/edgeMesh/edgeMeshI.H index d5e38343ec..c15fbd14ce 100644 --- a/src/edgeMesh/edgeMeshI.H +++ b/src/edgeMesh/edgeMeshI.H @@ -69,4 +69,14 @@ inline Foam::edgeList& Foam::edgeMesh::storedEdges() } +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +void Foam::edgeMesh::operator=(const edgeMesh& rhs) +{ + points_ = rhs.points_; + edges_ = rhs.edges_; + pointEdgesPtr_.clear(); +} + + // ************************************************************************* // diff --git a/src/edgeMesh/featureEdgeMesh/featureEdgeMesh.C b/src/edgeMesh/featureEdgeMesh/featureEdgeMesh.C index 34bcd4388e..da89dcf2d5 100644 --- a/src/edgeMesh/featureEdgeMesh/featureEdgeMesh.C +++ b/src/edgeMesh/featureEdgeMesh/featureEdgeMesh.C @@ -24,18 +24,56 @@ License \*---------------------------------------------------------------------------*/ #include "featureEdgeMesh.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::featureEdgeMesh, 0); +Foam::scalar Foam::featureEdgeMesh::cosNormalAngleTol_ = + Foam::cos(degToRad(0.1)); + + +Foam::label Foam::featureEdgeMesh::convexStart_ = 0; + + +Foam::label Foam::featureEdgeMesh::externalStart_ = 0; + + +Foam::label Foam::featureEdgeMesh::nPointTypes = 4; + + +Foam::label Foam::featureEdgeMesh::nEdgeTypes = 5; + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::featureEdgeMesh::featureEdgeMesh(const IOobject& io) : regIOobject(io), - edgeMesh(pointField(0), edgeList(0)) + 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 ( @@ -52,9 +90,39 @@ Foam::featureEdgeMesh::featureEdgeMesh(const IOobject& io) << endl; } + Istream& is = readStream(typeName); + + is >> *this + >> concaveStart_ + >> mixedStart_ + >> nonFeatureStart_ + >> internalStart_ + >> flatStart_ + >> openStart_ + >> multipleStart_ + >> normals_ + >> edgeNormals_ + >> featurePointNormals_ + >> regionEdges_; - readStream(typeName) >> *this; 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) @@ -71,11 +139,25 @@ Foam::featureEdgeMesh::featureEdgeMesh(const IOobject& io) Foam::featureEdgeMesh::featureEdgeMesh ( const IOobject& io, - const featureEdgeMesh& em + const featureEdgeMesh& fem ) : regIOobject(io), - edgeMesh(em) + 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_() {} @@ -87,42 +169,851 @@ Foam::featureEdgeMesh::featureEdgeMesh ) : regIOobject(io), - edgeMesh(pointLst, edgeLst) -{ - if + 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::featureEdgeMesh::featureEdgeMesh +( + const surfaceFeatures& sFeat, + const objectRegistry& obr, + const fileName& sFeatFileName +) +: + regIOobject ( - io.readOpt() == IOobject::MUST_READ - || io.readOpt() == IOobject::MUST_READ_IF_MODIFIED - || (io.readOpt() == IOobject::READ_IF_PRESENT && headerOk()) - ) + IOobject + ( + sFeatFileName, + obr.time().constant(), + "featureEdgeMesh", + 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 featureEdgeMesh with the raw geometrical data. + + label nFeatEds = sFeat.featureEdges().size(); + + DynamicList tmpPts; + edgeList eds(nFeatEds); + DynamicList norms; + vectorField edgeDirections(nFeatEds); + labelListList edgeNormals(nFeatEds); + DynamicList