45 fileName foamName(d.caseName() +
".ftr");
53 for (i=ts.size()-1; i>=0; i--)
55 if (ts[i].value() <= d.timeOutputValue())
66 for (
label j=i; j>=0; j--)
68 if (
isFile(d.path()/ts[j].name()/typeName/foamName))
72 Pout<<
" triSurface::triSurfInstance(const Time& d)"
73 <<
"reading " << foamName
74 <<
" from " << ts[j].
name()/typeName
85 Pout<<
" triSurface::triSurfInstance(const Time& d)"
86 <<
"reading " << foamName
87 <<
" from constant/" <<
endl;
96 const label defaultRegion
103 const face&
f = faces[faceI];
108 <<
"Face at position " << faceI
109 <<
" does not have three vertices:" <<
f
113 labelledTri& tri = triFaces[faceI];
118 tri.region() = defaultRegion;
128 const label defaultRegion
137 labelledTri& tri = triFaces[faceI];
142 tri.region() = defaultRegion;
155 const labelledTri&
f,
160 << pre.c_str() <<
"vertex numbers:"
161 <<
f[0] <<
' ' <<
f[1] <<
' ' <<
f[2] <<
endl
162 << pre.c_str() <<
"vertex coords :"
164 << pre.c_str() <<
"region :" <<
f.region() <<
endl
176 while ((line.empty() || line[0] ==
'#') && is.good());
194 if (
f[fp] < 0 ||
f[fp] > maxPointI)
198 <<
" uses point indices outside point range 0.."
212 bool hasInvalid =
false;
216 const labelledTri&
f = (*this)[faceI];
218 if ((
f[0] ==
f[1]) || (
f[0] ==
f[2]) || (
f[1] ==
f[2]))
221 valid[faceI] =
false;
227 <<
"triangle " << faceI
228 <<
" does not have three unique vertices:\n";
235 const labelList& fEdges = faceEdges()[faceI];
242 const labelList& eFaces = edgeFaces()[fEdges[fp]];
246 label neighbour = eFaces[i];
248 if (neighbour > faceI)
251 const labelledTri&
n = (*this)[neighbour];
255 ((
f[0] ==
n[0]) || (
f[0] ==
n[1]) || (
f[0] ==
n[2]))
256 && ((
f[1] ==
n[0]) || (
f[1] ==
n[1]) || (
f[1] ==
n[2]))
257 && ((
f[2] ==
n[0]) || (
f[2] ==
n[1]) || (
f[2] ==
n[2]))
260 valid[faceI] =
false;
266 <<
"triangles share the same vertices:\n"
267 <<
" face 1 :" << faceI <<
endl;
273 << neighbour <<
endl;
293 const labelledTri&
f = (*this)[faceI];
294 (*this)[newFaceI++] =
f;
301 <<
"Removing " << size() - newFaceI
302 <<
" illegal faces." <<
endl;
304 (*this).setSize(newFaceI);
319 const labelList& myFaces = eFaces[edgeI];
324 <<
"Edge " << edgeI <<
" with vertices " << edges()[edgeI]
325 <<
" has no edgeFaces"
328 else if (myFaces.size() > 2 && verbose)
331 <<
"Edge " << edgeI <<
" with vertices " << edges()[edgeI]
332 <<
" has more than 2 faces connected to it : " << myFaces
342 is >> patches_ >> storedPoints() >> storedFaces();
351 const fileName&
name,
364 fileName unzipName =
name.lessExt();
367 return read(unzipName, unzipName.ext(),
false);
369 else if (ext ==
"ftr")
373 else if (ext ==
"stl")
375 return readSTL(
name);
377 else if (ext ==
"stlb")
379 return readSTLBINARY(
name);
381 else if (ext ==
"gts")
383 return readGTS(
name);
385 else if (ext ==
"obj")
387 return readOBJ(
name);
389 else if (ext ==
"off")
391 return readOFF(
name);
393 else if (ext ==
"tri")
395 return readTRI(
name);
397 else if (ext ==
"ac")
401 else if (ext ==
"nas")
403 return readNAS(
name);
405 else if (ext ==
"vtk")
407 return readVTK(
name);
412 <<
"unknown file extension " << ext
413 <<
". Supported extensions are '.ftr', '.stl', '.stlb', '.gts'"
414 <<
", '.obj', '.ac', '.off', '.nas', '.tri' and '.vtk'"
425 const fileName&
name,
434 else if (ext ==
"stl")
436 return writeSTLASCII(
sort, OFstream(
name)());
438 else if (ext ==
"stlb")
440 ofstream outFile(
name.c_str(), std::ios::binary);
442 writeSTLBINARY(outFile);
444 else if (ext ==
"gts")
446 return writeGTS(
sort, OFstream(
name)());
448 else if (ext ==
"obj")
452 else if (ext ==
"off")
456 else if (ext ==
"vtk")
460 else if (ext ==
"tri")
464 else if (ext ==
"dx")
468 else if (ext ==
"ac")
470 writeAC(OFstream(
name)());
472 else if (ext ==
"smesh")
479 <<
"unknown file extension " << ext
480 <<
" for file " <<
name
481 <<
". Supported extensions are '.ftr', '.stl', '.stlb', "
482 <<
"'.gts', '.obj', '.vtk'"
483 <<
", '.off', '.dx', '.smesh', '.ac' and '.tri'"
494 SortableList<label> sortedRegion(size());
496 forAll(sortedRegion, faceI)
498 sortedRegion[faceI] = operator[](faceI).region();
502 faceMap = sortedRegion.indices();
505 label maxRegion = patches_.size()-1;
512 operator[](
faceMap.last()).region()
522 label region = operator[](faceI).region();
524 newPatches[region].size()++;
530 label startFaceI = 0;
531 forAll(newPatches, newPatchI)
533 surfacePatch& newPatch = newPatches[newPatchI];
535 newPatch.index() = newPatchI;
537 label oldPatchI = newPatchI;
540 newPatch.start() = startFaceI;
544 if ((oldPatchI < patches_.size()) && (patches_[oldPatchI].name() !=
""))
546 newPatch.name() = patches_[oldPatchI].name();
550 newPatch.name() = word(
"patch") +
name(newPatchI);
555 (oldPatchI < patches_.size())
556 && (patches_[oldPatchI].geometricType() !=
"")
559 newPatch.geometricType() = patches_[oldPatchI].geometricType();
563 newPatch.geometricType() =
"empty";
566 startFaceI += newPatch.size();
581 patches_.setSize(newPatches.size());
583 forAll(newPatches, patchI)
585 patches_[patchI].index() = patchI;
586 patches_[patchI].name() = newPatches[patchI].name();
587 patches_[patchI].geometricType() = newPatches[patchI].geometricType();
598 sortedEdgeFacesPtr_(NULL),
611 ParentType(triangles,
points),
613 sortedEdgeFacesPtr_(NULL),
626 ParentType(triangles,
points, reUse),
628 sortedEdgeFacesPtr_(NULL),
642 sortedEdgeFacesPtr_(NULL),
653 ParentType(triangles,
points),
655 sortedEdgeFacesPtr_(NULL),
668 ParentType(convertToTri(triangles, 0),
points),
670 sortedEdgeFacesPtr_(NULL),
681 sortedEdgeFacesPtr_(NULL),
684 word ext =
name.ext();
696 sortedEdgeFacesPtr_(NULL),
709 sortedEdgeFacesPtr_(NULL),
712 fileName foamFile(d.caseName() +
".ftr");
716 IFstream foamStream(foamPath);
726 ParentType(ts, ts.
points()),
728 sortedEdgeFacesPtr_(NULL),
745 ParentType::clearTopology();
753 ParentType::clearPatchMeshAddr();
759 ParentType::clearOut();
762 clearPatchMeshAddr();
768 if (!sortedEdgeFacesPtr_)
770 calcSortedEdgeFaces();
773 return *sortedEdgeFacesPtr_;
784 return *edgeOwnerPtr_;
794 ParentType::movePoints(newPoints);
797 storedPoints() = newPoints;
804 if (scaleFactor > 0 && scaleFactor != 1.0)
812 storedPoints() *= scaleFactor;
821 stitchTriangles(SMALL, verbose);
826 checkTriangles(verbose);
838 const label currentZone,
848 DynamicList<label> newChangedFaces(2*changedFaces.size());
852 label faceI = changedFaces[i];
854 const labelList& fEdges = faceEdges()[faceI];
858 label edgeI = fEdges[i];
860 if (!borderEdge[edgeI])
862 const labelList& eFaces = edgeFaces()[edgeI];
866 label nbrFaceI = eFaces[j];
868 if (faceZone[nbrFaceI] == -1)
870 faceZone[nbrFaceI] = currentZone;
871 newChangedFaces.append(nbrFaceI);
873 else if (faceZone[nbrFaceI] != currentZone)
876 <<
"Zones " << faceZone[nbrFaceI]
877 <<
" at face " << nbrFaceI
878 <<
" connects to zone " << currentZone
879 <<
" at face " << faceI
887 if (newChangedFaces.empty())
892 changedFaces.transfer(newChangedFaces);
905 faceZone.setSize(size());
908 if (borderEdge.size() != nEdges())
911 <<
"borderEdge boolList not same size as number of edges" <<
endl
912 <<
"borderEdge:" << borderEdge.size() <<
endl
913 <<
"nEdges :" << nEdges()
919 for (
label startFaceI = 0;; zoneI++)
922 for (; startFaceI < size(); startFaceI++)
924 if (faceZone[startFaceI] == -1)
930 if (startFaceI >= size())
935 faceZone[startFaceI] = zoneI;
937 markZone(borderEdge, startFaceI, zoneI, faceZone);
964 if (include[oldFaceI])
977 pointHad[labI] =
true;
978 pointMap[pointI++] = labI;
986 pointMap.setSize(pointI);
1001 subsetMeshMap(include, pointMap,
faceMap);
1009 newPoints[pointi] = locPoints[pointMap[pointi]];
1010 oldToNew[pointMap[pointi]] = pointi;
1019 const labelledTri& tri = locFaces[
faceMap[facei]];
1021 newTriangles[facei][0] = oldToNew[tri[0]];
1022 newTriangles[facei][1] = oldToNew[tri[1]];
1023 newTriangles[facei][2] = oldToNew[tri[2]];
1024 newTriangles[facei].region() = tri.region();
1028 return triSurface(newTriangles,
patches(), newPoints,
true);
1034 const fileName&
name,
1035 const bool sortByRegion
1051 os.
check(
"triSurface::write(Ostream&)");
1057 fileName foamFile(d.caseName() +
".ftr");
1059 fileName foamPath(d.path()/triSurfInstance(d)/typeName/foamFile);
1061 OFstream foamStream(foamPath);
1071 PackedBoolList pointIsUsed(
points().size());
1083 if (pointIsUsed.set(pointI, 1))
1092 os <<
"Triangles : " << size() <<
endl
1094 <<
"Bounding Box : " << bb <<
endl;
1104 storedPoints() = ts.points();
1105 patches_ = ts.patches();