50 const Switch& geometricTestOnly
58 Info<<
nl <<
"Reading existing feature edges from file "
59 << featureEdgeFile <<
nl
60 <<
"Selecting edges purely based on geometric tests: "
80 const Switch& geometricTestOnly,
81 const scalar includedAngle
85 <<
"Constructing feature set from included angle "
86 << includedAngle <<
nl
87 <<
"Selecting edges purely based on geometric tests: "
109 const scalar includedAngle
122 if (fileNames.found(surfaceFileName))
124 return extractFromFile
126 fileNames[surfaceFileName],
133 return extractFromSurface
143 return extractFromSurface
162 Info<<
"Surface : " << surfaceFileName <<
nl <<
endl;
173 const Switch featureProximity =
177 Info<<
nl <<
"Feature line extraction is only valid on closed manifold "
178 <<
"surfaces." <<
endl;
200 const scalar includedAngle =
227 if (minElem > 0 || minLen > 0)
229 Info<<
"Removing features of length < "
231 Info<<
"Removing features with number of edges < "
234 set().trimFeatures(minLen, minElem, includedAngle);
252 if (subsetDict.
found(
"insideBox"))
256 Info<<
"Selecting edges inside bb " << bb;
259 Info <<
" see insideBox.obj";
260 bb.writeOBJ(
"insideBox.obj");
266 else if (subsetDict.
found(
"outsideBox"))
270 Info<<
"Removing all edges inside bb " << bb;
273 Info<<
" see outsideBox.obj" <<
endl;
274 bb.writeOBJ(
"outsideBox.obj");
281 const Switch nonManifoldEdges =
284 if (!nonManifoldEdges)
286 Info<<
"Removing all non-manifold edges"
287 <<
" (edges with > 2 connected faces) unless they"
288 <<
" cross multiple regions" <<
endl;
298 Info<<
"Removing all open edges"
299 <<
" (edges with 1 connected face)" <<
endl;
310 if (subsetDict.
found(
"plane"))
316 Info<<
"Only edges that intersect the plane with normal "
318 <<
" and base point " << cutPlane.refPoint()
319 <<
" will be included as feature edges."<<
endl;
325 newSet.setFromStatus(edgeStat, includedAngle);
328 <<
"Initial feature set:" <<
nl
329 <<
" feature points : " << newSet.featurePoints().size() <<
nl
330 <<
" feature edges : " << newSet.featureEdges().size() <<
nl
332 <<
" region edges : " << newSet.nRegionEdges() <<
nl
333 <<
" external edges : " << newSet.nExternalEdges() <<
nl
334 <<
" internal edges : " << newSet.nInternalEdges() <<
nl
349 surfBaffleRegions[pI] =
true;
358 sFeatFileName +
".extendedFeatureEdgeMesh",
366 Info<<
"Adding (without merging) features from " << addFeName
375 "extendedFeatureEdgeMesh",
381 Info<<
"Read " << addFeMesh.name() <<
nl;
382 addFeMesh.writeStats(
Info);
384 feMesh.add(addFeMesh);
389 <<
"Final feature set:" <<
nl;
390 feMesh.writeStats(
Info);
392 Info<<
nl <<
"Writing extendedFeatureEdgeMesh to "
393 << feMesh.relativeObjectPath() <<
endl;
395 mkDir(feMesh.path());
425 Info<<
nl <<
"Writing featureEdgeMesh to "
426 << bfeMesh.relativeObjectPath() <<
endl;
428 bfeMesh.regIOobject::write();
432 boolList writeVTKFieldIsPointValues;
433 #define DeclareWriteVTKFieldTypeValues(Type, nullArg) \
434 PtrList<const Field<Type>> writeVTKField##Type##Values;
436 #undef DeclareWriteVTKFieldTypeValues
441 Info<<
nl <<
"Extracting internal and external closeness of "
442 <<
"surface." <<
endl;
446 const Switch faceCloseness =
448 const Switch pointCloseness =
451 const scalar internalAngleTolerance
455 "internalAngleTolerance",
461 const scalar externalAngleTolerance
465 "externalAngleTolerance",
476 sFeatFileName +
".closeness",
488 searchSurf.extractCloseness
490 internalAngleTolerance,
491 externalAngleTolerance
496 << closenessFields.first()->name() <<
endl;
497 closenessFields.first()->
write();
500 << closenessFields.second()->name() <<
endl;
501 closenessFields.second()->
write();
505 writeVTKFieldNames.
append(
"internalCloseness");
506 writeVTKFieldIsPointValues.
append(
false);
507 writeVTKFieldscalarValues.append
512 writeVTKFieldNames.
append(
"externalCloseness");
513 writeVTKFieldIsPointValues.
append(
false);
514 writeVTKFieldscalarValues.append
525 searchSurf.extractPointCloseness
527 internalAngleTolerance,
528 externalAngleTolerance
533 << closenessFields.first()->name() <<
endl;
534 closenessFields.first()->
write();
537 << closenessFields.second()->name() <<
endl;
538 closenessFields.second()->
write();
542 const faceList faces(searchSurf.faces());
543 const Map<label>& meshPointMap = searchSurf.meshPointMap();
546 internalClosenessPointField = closenessFields.
first();
549 externalClosenessPointField = closenessFields.second();
551 scalarField internalCloseness(searchSurf.nPoints(), great);
552 scalarField externalCloseness(searchSurf.nPoints(), great);
556 internalCloseness[
pi] =
557 internalClosenessPointField[meshPointMap[
pi]];
559 externalCloseness[
pi] =
560 externalClosenessPointField[meshPointMap[
pi]];
563 writeVTKFieldNames.
append(
"internalPointCloseness");
564 writeVTKFieldIsPointValues.
append(
true);
565 writeVTKFieldscalarValues.append
570 writeVTKFieldNames.
append(
"externalPointCloseness");
571 writeVTKFieldIsPointValues.
append(
true);
572 writeVTKFieldscalarValues.append
583 Info<<
nl <<
"Extracting curvature of surface at the points."
590 sFeatFileName +
".curvature",
604 writeVTKFieldNames.
append(
"curvature");
605 writeVTKFieldIsPointValues.
append(
true);
611 if (featureProximity)
613 Info<<
nl <<
"Extracting proximity of close feature points and "
614 <<
"edges to the surface" <<
endl;
616 const scalar searchDistance =
632 feMesh.allNearestFeatureEdges(
c, rSqr, hitList);
633 featureProximity[fi] =
min
635 feMesh.minDisconnectedDist(hitList),
639 feMesh.allNearestFeaturePoints(
c, rSqr, hitList);
640 featureProximity[fi] =
min
651 sFeatFileName +
".featureProximity",
663 featureProximityField.write();
667 writeVTKFieldNames.
append(
"featureProximity");
668 writeVTKFieldIsPointValues.
append(
false);
669 writeVTKFieldscalarValues.append
678 #define WriteVTKResizeFieldTypeValues(Type, nullArg) \
679 writeVTKField##Type##Values.resize(writeVTKFieldNames.size());
681 #undef WriteVTKResizeFieldTypeValues
688 /sFeatFileName +
"Features.vtk",
696 writeVTKFieldIsPointValues,
698 #define WriteVTKFieldTypeValuesParameter(Type, nullArg) \
701 #undef WriteVTKFieldTypeValuesParameter
716 forAll(surfaceFileNames, i)
718 extractFeatures(surfaceFileNames[i], runTime,
dict);
726 int main(
int argc,
char *argv[])
730 "extract and write surface features to file"
754 if (!iter().isDict())
#define forAll(list, i)
Loop across all elements in list.
#define forAllConstIter(Container, container, iter)
Iterate across all elements in the container object of type.
Field with dimensions and associated with geometry type GeoMesh which is used to size the field and a...
An STL-conforming hash table.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
void append(const T &)
Append an element at the end of the list.
void size(const label)
Override size to be inconsistent with allocated storage.
virtual Ostream & write(const char)=0
Write character.
An ordered pair of two objects of type <T> with first() and second() elements.
const Field< PointType > & points() const
Return reference to global points.
const labelListList & edgeFaces() const
Return edge-face addressing.
A simple wrapper around bool so that it can be read as a word: true/false, on/off,...
const char * asText() const
Return a text representation of the Switch.
static const word & constant()
Return constant name.
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
fileName path() const
Explicitly inherit path from TimePaths to disambiguate from.
IOstream::streamFormat writeFormat() const
Default write format.
A 2-tuple for storing two objects of different types.
const Type2 & second() const
Return second.
const Type1 & first() const
Return first.
T & first()
Return the first element of the list.
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
static void addNote(const string &)
Add extra notes for the usage information.
static void noParallel()
Remove the parallel options.
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
time_t elapsedClockTime() const
Returns wall-clock time from clock instantiation.
double elapsedCpuTime() const
Return CPU time (in seconds) from the start.
A list of keyword definitions, which are a keyword followed by any number of values (e....
T lookupOrDefault(const word &, const T &, bool recursive=false, bool patternMatch=true) const
Find and return a T, if not found return the given default.
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.
bool isDict(const word &) const
Check if entry is a sub-dictionary.
const dictionary & subDict(const word &) const
Find and return a sub-dictionary.
T lookupOrAddDefault(const word &, const T &, bool recursive=false, bool patternMatch=true)
Find and return a T, if not found return the given.
bool readIfPresent(const word &, T &, bool recursive=false, bool patternMatch=true) const
Find an entry if present, and assign to T.
bool found(const word &, bool recursive=false, bool patternMatch=true) const
Search dictionary for given keyword.
Points connected by edges.
A class for handling file names.
word name() const
Return file name (part beyond last /)
fileName lessExt() const
Return file name without extension (part before last .)
const Time & time() const
Return time.
Geometric class that creates a 2D plane and can return the intersection point between a line and the ...
static const word & geometryDir()
Return the geometry directory name.
Holds feature edges/points of surface.
Standard boundBox + extra functionality for use in octree.
A surface geometry formed of discrete facets, e.g. triangles and/or quadrilaterals,...
Triangulated surface description with patch information.
tmp< scalarField > curvature() const
Return the curvature of surface at the points.
const geometricSurfacePatchList & patches() const
void writeStats(Ostream &) const
Write some statistics.
faceList faces() const
Return the list of triangles as a faceList.
A triangle primitive used to calculate face areas and swept volumes.
Tuple2< Point, scalar > circumCircle() const
Return the circum centre and radius.
A class for handling words, derived from string.
int main(int argc, char *argv[])
const dimensionedScalar c
Speed of light in a vacuum.
void write(const fileName &file, const word &title, const bool binary, const PointField &points, const VertexList &vertices, const LineList &lines, const FaceList &faces, const wordList &fieldNames, const boolList &fieldIsPointValues, const UPtrList< const Field< label >> &fieldLabelValues #define FieldTypeValuesConstArg(Type, nullArg))
Write VTK polygonal data to a file. Takes a PtrList of fields of labels and.
List< fileName > fileNameList
A List of fileNames.
scalar minDist(const List< pointIndexHit > &hitList)
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
IOdictionary systemDict(const word &dictName, const argList &args, const objectRegistry &ob, const word ®ionName=polyMesh::defaultRegion)
dimensionedSymmTensor sqr(const dimensionedVector &dv)
bool mkDir(const fileName &, mode_t=0777)
Make a directory and return an error if it could not be created.
Ostream & endl(Ostream &os)
Add newline and flush stream.
word name(const bool)
Return a word representation of a bool.
void selectBox(const triSurface &surf, const boundBox &bb, const bool removeInside, List< surfaceFeatures::edgeStatus > &edgeStat)
Select edges inside or outside bounding box.
const dimensionSet dimLength
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
layerAndWeight min(const layerAndWeight &a, const layerAndWeight &b)
List< labelList > labelListList
A List of labelList.
void selectManifoldEdges(const triSurface &surf, const scalar tol, const scalar includedAngle, List< surfaceFeatures::edgeStatus > &edgeStat)
Select manifold edges.
void writeVTK(OFstream &os, const Type &value)
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurrence of given element and return index,.
void selectCutEdges(const triSurface &surf, const plane &cutPlane, List< surfaceFeatures::edgeStatus > &edgeStat)
Select edges that are intersected by the given plane.
FOR_ALL_FIELD_TYPES(makeFieldSourceTypedef)
const unitConversion unitDegrees
Foam::argList args(argc, argv)