From 217405865a3e7c2af170a00d8f29f457faafa85e Mon Sep 17 00:00:00 2001 From: mattijs Date: Tue, 29 May 2012 10:38:50 +0100 Subject: [PATCH] ENH: surfaceFeatureExtract: adding of extendedFeatureEdgeMeshes --- .../surfaceFeatureExtract.C | 67 +++- .../surfaceFeatureExtractDict | 6 + .../extendedFeatureEdgeMesh.C | 292 ++++++++++++++++-- .../extendedFeatureEdgeMesh.H | 20 +- 4 files changed, 351 insertions(+), 34 deletions(-) diff --git a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C index 5dd7671b94..0d7c929cf6 100644 --- a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C +++ b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtract.C @@ -472,6 +472,33 @@ void unmarkBaffles } +void writeStats(const extendedFeatureEdgeMesh& fem, Ostream& os) +{ + os << " points : " << fem.points().size() << nl + << " of which" << nl + << " convex : " + << fem.concaveStart() << nl + << " concave : " + << (fem.mixedStart()-fem.concaveStart()) << nl + << " mixed : " + << (fem.nonFeatureStart()-fem.mixedStart()) << nl + << " non-feature : " + << (fem.points().size()-fem.nonFeatureStart()) << nl + << " edges : " << fem.edges().size() << nl + << " of which" << nl + << " external edges : " + << fem.internalStart() << nl + << " internal edges : " + << (fem.flatStart()- fem.internalStart()) << nl + << " flat edges : " + << (fem.openStart()- fem.flatStart()) << nl + << " open edges : " + << (fem.multipleStart()- fem.openStart()) << nl + << " multiply connected : " + << (fem.edges().size()- fem.multipleStart()) << nl; +} + + // Main program: int main(int argc, char *argv[]) @@ -746,16 +773,6 @@ int main(int argc, char *argv[]) // newSet.writeObj("final"); //} - Info<< nl - << "Final feature set after trimming and subsetting:" << nl - << " feature points : " << newSet.featurePoints().size() << nl - << " feature edges : " << newSet.featureEdges().size() << nl - << " of which" << nl - << " region edges : " << newSet.nRegionEdges() << nl - << " external edges : " << newSet.nExternalEdges() << nl - << " internal edges : " << newSet.nInternalEdges() << nl - << endl; - // Extracting and writing a extendedFeatureEdgeMesh extendedFeatureEdgeMesh feMesh ( @@ -764,6 +781,36 @@ int main(int argc, char *argv[]) sFeatFileName + ".extendedFeatureEdgeMesh" ); + + if (surfaceDict.isDict("addFeatures")) + { + const word addFeName = surfaceDict.subDict("addFeatures")["name"]; + Info<< "Adding (without merging) features from " << addFeName + << nl << endl; + + extendedFeatureEdgeMesh addFeMesh + ( + IOobject + ( + addFeName, + runTime.time().constant(), + "extendedFeatureEdgeMesh", + runTime.time(), + IOobject::MUST_READ, + IOobject::NO_WRITE + ) + ); + Info<< "Read " << addFeMesh.name() << nl; + writeStats(addFeMesh, Info); + + feMesh.add(addFeMesh); + } + + + Info<< nl + << "Final feature set:" << nl; + writeStats(feMesh, Info); + Info<< nl << "Writing extendedFeatureEdgeMesh to " << feMesh.objectPath() << endl; diff --git a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtractDict b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtractDict index e9741543bd..5e87e98a2b 100644 --- a/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtractDict +++ b/applications/utilities/surface/surfaceFeatureExtract/surfaceFeatureExtractDict @@ -70,6 +70,12 @@ surface2.nas manifoldEdges no; } + addFeatures + { + // Add (without merging) another extendedFeatureEdgeMesh + name axZ.extendedFeatureEdgeMesh; + } + // Output the curvature of the surface curvature no; diff --git a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C index aa046d6ec6..7899c7743a 100644 --- a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C +++ b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C @@ -33,6 +33,7 @@ License #include "OFstream.H" #include "IFstream.H" #include "unitConversion.H" +#include "DynamicField.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -1059,12 +1060,264 @@ Foam::extendedFeatureEdgeMesh::edgeTreesByType() const } +void Foam::extendedFeatureEdgeMesh::add(const extendedFeatureEdgeMesh& fem) +{ + // Points + // ~~~~~~ + + // From current points into combined points + labelList reversePointMap(points().size()); + labelList reverseFemPointMap(fem.points().size()); + + label newPointI = 0; + for (label i = 0; i < concaveStart(); i++) + { + reversePointMap[i] = newPointI++; + } + for (label i = 0; i < fem.concaveStart(); i++) + { + reverseFemPointMap[i] = newPointI++; + } + + // Concave + label newConcaveStart = newPointI; + for (label i = concaveStart(); i < mixedStart(); i++) + { + reversePointMap[i] = newPointI++; + } + for (label i = fem.concaveStart(); i < fem.mixedStart(); i++) + { + reverseFemPointMap[i] = newPointI++; + } + + // Mixed + label newMixedStart = newPointI; + for (label i = mixedStart(); i < nonFeatureStart(); i++) + { + reversePointMap[i] = newPointI++; + } + for (label i = fem.mixedStart(); i < fem.nonFeatureStart(); i++) + { + reverseFemPointMap[i] = newPointI++; + } + + // Non-feature + label newNonFeatureStart = newPointI; + for (label i = nonFeatureStart(); i < points().size(); i++) + { + reversePointMap[i] = newPointI++; + } + for (label i = fem.nonFeatureStart(); i < fem.points().size(); i++) + { + reverseFemPointMap[i] = newPointI++; + } + + +//Pout<< "points:" << points().size() << endl; +//Pout<< "reversePointMap:" << reversePointMap << endl; +// +//Pout<< "fem.points:" << fem.points().size() << endl; +//Pout<< "reverseFemPointMap:" << reverseFemPointMap << endl; + + + + pointField newPoints(newPointI); + newPoints.rmap(points(), reversePointMap); + newPoints.rmap(fem.points(), reverseFemPointMap); + + + // Edges + // ~~~~~ + + // From current edges into combined edges + labelList reverseEdgeMap(edges().size()); + labelList reverseFemEdgeMap(fem.edges().size()); + + // External + label newEdgeI = 0; + for (label i = 0; i < internalStart(); i++) + { + reverseEdgeMap[i] = newEdgeI++; + } + for (label i = 0; i < fem.internalStart(); i++) + { + reverseFemEdgeMap[i] = newEdgeI++; + } + + // Internal + label newInternalStart = newEdgeI; + for (label i = internalStart(); i < flatStart(); i++) + { + reverseEdgeMap[i] = newEdgeI++; + } + for (label i = fem.internalStart(); i < fem.flatStart(); i++) + { + reverseFemEdgeMap[i] = newEdgeI++; + } + + // Flat + label newFlatStart = newEdgeI; + for (label i = flatStart(); i < openStart(); i++) + { + reverseEdgeMap[i] = newEdgeI++; + } + for (label i = fem.flatStart(); i < fem.openStart(); i++) + { + reverseFemEdgeMap[i] = newEdgeI++; + } + + // Open + label newOpenStart = newEdgeI; + for (label i = openStart(); i < multipleStart(); i++) + { + reverseEdgeMap[i] = newEdgeI++; + } + for (label i = fem.openStart(); i < fem.multipleStart(); i++) + { + reverseFemEdgeMap[i] = newEdgeI++; + } + + // Multiple + label newMultipleStart = newEdgeI; + for (label i = multipleStart(); i < edges().size(); i++) + { + reverseEdgeMap[i] = newEdgeI++; + } + for (label i = fem.multipleStart(); i < fem.edges().size(); i++) + { + reverseFemEdgeMap[i] = newEdgeI++; + } + + edgeList newEdges(newEdgeI); + UIndirectList(newEdges, reverseEdgeMap) = edges(); + UIndirectList(newEdges, reverseFemEdgeMap) = fem.edges(); + + pointField newEdgeDirections(newEdgeI); + newEdgeDirections.rmap(edgeDirections(), reverseEdgeMap); + newEdgeDirections.rmap(fem.edgeDirections(), reverseFemEdgeMap); + + + + + // Normals + // ~~~~~~~ + + // Combine normals + DynamicField newNormals(normals().size()+fem.normals().size()); + newNormals.append(normals()); + newNormals.append(fem.normals()); + + + // Combine and re-index into newNormals + labelListList newEdgeNormals(edgeNormals().size()+fem.edgeNormals().size()); + UIndirectList(newEdgeNormals, reverseEdgeMap) = + edgeNormals(); + UIndirectList(newEdgeNormals, reverseFemEdgeMap) = + fem.edgeNormals(); + forAll(reverseFemEdgeMap, i) + { + label mapI = reverseFemEdgeMap[i]; + labelList& en = newEdgeNormals[mapI]; + forAll(en, j) + { + en[j] += edgeNormals().size(); + } + } + +//Pout<< "fem.featurePointNormals().size():" << fem.featurePointNormals().size() +// << endl; +//Pout<< "fem.nonFeatureStart():" << fem.nonFeatureStart() << endl; +//Pout<< "reverseFemPointMap:" << reverseFemPointMap.size() << endl; + + + // Combine and re-index into newFeaturePointNormals + labelListList newFeaturePointNormals + ( + featurePointNormals().size() + + fem.featurePointNormals().size() + ); + +//Pout<< "newFeaturePointNormals:" << newFeaturePointNormals.size() << endl; +//Pout<< "Doing featurePointNormals." << endl; + + // Note: featurePointNormals only go up to nonFeatureStart + UIndirectList + ( + newFeaturePointNormals, + SubList