54 for (i=ts.size()-1; i>=0; i--)
67 for (label j=i; j>=0; j--)
73 Pout<<
" triSurface::triSurfInstance(const Time& d)"
74 <<
"reading " << foamName
75 <<
" from " << ts[j].
name()/typeName
86 Pout<<
" triSurface::triSurfInstance(const Time& d)"
87 <<
"reading " << foamName
88 <<
" from constant/" <<
endl;
97 const label defaultRegion
104 const face&
f = faces[faceI];
110 "triSurface::convertToTri"
111 "(const faceList&, const label)"
112 ) <<
"Face at position " << faceI
113 <<
" does not have three vertices:" << f
117 labelledTri& tri = triFaces[faceI];
122 tri.region() = defaultRegion;
132 const label defaultRegion
135 List<labelledTri> triFaces(faces.size());
139 const triFace& f = faces[faceI];
141 labelledTri& tri = triFaces[faceI];
146 tri.region() = defaultRegion;
155 void Foam::triSurface::printTriangle
159 const labelledTri& f,
164 << pre.c_str() <<
"vertex numbers:"
165 << f[0] <<
' ' << f[1] <<
' ' << f[2] <<
endl
166 << pre.c_str() <<
"vertex coords :"
167 << points[f[0]] <<
' ' << points[f[1]] <<
' ' << points[f[2]]
168 << pre.c_str() <<
"region :" << f.region() <<
endl
173 Foam::string Foam::triSurface::getLineNoComment(IFstream& is)
180 while ((line.empty() || line[0] ==
'#') && is.good());
198 (f[0] < 0) || (f[0] > maxPointI)
199 || (f[1] < 0) || (f[1] > maxPointI)
200 || (f[2] < 0) || (f[2] > maxPointI)
205 <<
" uses point indices outside point range 0.."
218 bool hasInvalid =
false;
226 if ((f[0] == f[1]) || (f[0] == f[2]) || (f[1] == f[2]))
229 valid[faceI] =
false;
236 "triSurface::checkTriangles(bool verbose)"
237 ) <<
"triangle " << faceI
238 <<
" does not have three unique vertices:\n";
245 const labelList& neighbours = fFaces[faceI];
249 forAll(neighbours, neighbourI)
251 if (neighbours[neighbourI] <= faceI)
257 const labelledTri& n = (*this)[neighbours[neighbourI]];
261 ((f[0] == n[0]) || (f[0] == n[1]) || (f[0] == n[2]))
262 && ((f[1] == n[0]) || (f[1] == n[1]) || (f[1] == n[2]))
263 && ((f[2] == n[0]) || (f[2] == n[1]) || (f[2] == n[2]))
266 valid[faceI] =
false;
273 "triSurface::checkTriangles(bool verbose)"
274 ) <<
"triangles share the same vertices:\n"
275 <<
" face 1 :" << faceI <<
endl;
281 << neighbours[neighbourI] <<
endl;
300 (*this)[newFaceI++] =
f;
308 "triSurface::checkTriangles(bool verbose)"
309 ) <<
"Removing " << size() - newFaceI
310 <<
" illegal faces." <<
endl;
312 (*this).setSize(newFaceI);
327 const labelList& myFaces = eFaces[edgeI];
332 <<
"Edge " << edgeI <<
" with vertices " << edges()[edgeI]
333 <<
" has no edgeFaces"
336 else if (myFaces.
size() > 2)
340 "triSurface::checkEdges(bool verbose)"
341 ) <<
"Edge " << edgeI <<
" with vertices " << edges()[edgeI]
342 <<
" has more than 2 faces connected to it : " << myFaces
350 bool Foam::triSurface::read(
Istream& is)
352 is >> patches_ >> storedPoints() >> storedFaces();
359 bool Foam::triSurface::read
361 const fileName&
name,
366 if (check && !
exists(name))
370 "triSurface::read(const fileName&, const word&, const bool)"
376 fileName unzipName = name.lessExt();
379 return read(unzipName, unzipName.ext(),
false);
381 else if (ext ==
"ftr")
383 return read(IFstream(name)());
385 else if (ext ==
"stl")
387 return readSTL(name);
389 else if (ext ==
"stlb")
391 return readSTL(name);
393 else if (ext ==
"gts")
395 return readGTS(name);
397 else if (ext ==
"obj")
399 return readOBJ(name);
401 else if (ext ==
"off")
403 return readOFF(name);
405 else if (ext ==
"tri")
407 return readTRI(name);
409 else if (ext ==
"ac")
413 else if (ext ==
"nas")
415 return readNAS(name);
421 "triSurface::read(const fileName&, const word&)"
422 ) <<
"unknown file extension " << ext
423 <<
". Supported extensions are '.ftr', '.stl', '.stlb', '.gts'"
424 <<
", '.obj', '.ac', '.off', '.nas' and '.tri'"
433 void Foam::triSurface::write
435 const fileName& name,
442 return write(OFstream(name)());
444 else if (ext ==
"stl")
446 return writeSTLASCII(OFstream(name)());
448 else if (ext ==
"stlb")
450 ofstream outFile(name.c_str(), std::ios::binary);
452 writeSTLBINARY(outFile);
454 else if (ext ==
"gts")
456 return writeGTS(sort, OFstream(name)());
458 else if (ext ==
"obj")
462 else if (ext ==
"off")
464 writeOFF(sort, OFstream(name)());
466 else if (ext ==
"vtk")
468 writeVTK(sort, OFstream(name)());
470 else if (ext ==
"tri")
472 writeTRI(sort, OFstream(name)());
474 else if (ext ==
"dx")
476 writeDX(sort, OFstream(name)());
478 else if (ext ==
"ac")
480 writeAC(OFstream(name)());
482 else if (ext ==
"smesh")
484 writeSMESH(sort, OFstream(name)());
490 "triSurface::write(const fileName&, const word&, const bool)"
491 ) <<
"unknown file extension " << ext
492 <<
". Supported extensions are '.ftr', '.stl', '.stlb', "
493 <<
"'.gts', '.obj', '.vtk'"
494 <<
", '.off', '.dx', '.smesh', '.ac' and '.tri'"
505 SortableList<label> sortedRegion(size());
507 forAll(sortedRegion, faceI)
509 sortedRegion[faceI] = operator[](faceI).region();
513 faceMap = sortedRegion.indices();
516 label maxRegion = patches_.size()-1;
523 operator[](faceMap[faceMap.size() - 1]).region()
533 label region = operator[](faceI).region();
535 newPatches[region].size()++;
541 label startFaceI = 0;
542 forAll(newPatches, newPatchI)
544 surfacePatch& newPatch = newPatches[newPatchI];
546 newPatch.index() = newPatchI;
548 label oldPatchI = newPatchI;
551 newPatch.start() = startFaceI;
555 if ((oldPatchI < patches_.size()) && (patches_[oldPatchI].
name() !=
""))
557 newPatch.name() = patches_[oldPatchI].name();
561 newPatch.name() = word(
"patch") +
name(newPatchI);
566 (oldPatchI < patches_.size())
567 && (patches_[oldPatchI].geometricType() !=
"")
570 newPatch.geometricType() = patches_[oldPatchI].geometricType();
574 newPatch.geometricType() =
"empty";
577 startFaceI += newPatch.size();
584 void Foam::triSurface::setDefaultPatches()
592 patches_.setSize(newPatches.size());
594 forAll(newPatches, patchI)
596 patches_[patchI].index() = patchI;
597 patches_[patchI].name() = newPatches[patchI].name();
598 patches_[patchI].geometricType() = newPatches[patchI].geometricType();
609 sortedEdgeFacesPtr_(NULL),
624 sortedEdgeFacesPtr_(NULL),
639 sortedEdgeFacesPtr_(NULL),
652 sortedEdgeFacesPtr_(NULL),
665 ParentType(convertToTri(triangles, 0), points),
667 sortedEdgeFacesPtr_(NULL),
678 sortedEdgeFacesPtr_(NULL),
693 sortedEdgeFacesPtr_(NULL),
706 sortedEdgeFacesPtr_(NULL),
724 patches_(ts.patches()),
725 sortedEdgeFacesPtr_(NULL),
742 ParentType::clearTopology();
750 ParentType::clearPatchMeshAddr();
756 ParentType::clearOut();
759 clearPatchMeshAddr();
765 if (!sortedEdgeFacesPtr_)
767 calcSortedEdgeFaces();
770 return *sortedEdgeFacesPtr_;
781 return *edgeOwnerPtr_;
792 ParentType::movePoints(newPoints);
795 storedPoints() = newPoints;
803 if (scaleFactor > 0 && scaleFactor != 1.0)
811 storedPoints() *= scaleFactor;
820 stitchTriangles(
points(), SMALL, verbose);
825 checkTriangles(verbose);
837 const label currentZone,
851 label faceI = changedFaces[i];
853 const labelList& fEdges = faceEdges()[faceI];
857 label edgeI = fEdges[i];
859 if (!borderEdge[edgeI])
861 const labelList& eFaces = edgeFaces()[edgeI];
865 label nbrFaceI = eFaces[j];
867 if (faceZone[nbrFaceI] == -1)
869 faceZone[nbrFaceI] = currentZone;
870 newChangedFaces.
append(nbrFaceI);
872 else if (faceZone[nbrFaceI] != currentZone)
876 "triSurface::markZone(const boolList&,"
877 "const label, const label, labelList&) const"
879 <<
"Zones " << faceZone[nbrFaceI]
880 <<
" at face " << nbrFaceI
881 <<
" connects to zone " << currentZone
882 <<
" at face " << faceI
890 if (newChangedFaces.empty())
895 changedFaces.
transfer(newChangedFaces);
911 if (borderEdge.
size() != nEdges())
915 "triSurface::markZones"
916 "(const boolList&, labelList&)"
918 <<
"borderEdge boolList not same size as number of edges" <<
endl
919 <<
"borderEdge:" << borderEdge.
size() <<
endl
920 <<
"nEdges :" << nEdges()
926 for (label startFaceI = 0;; zoneI++)
929 for (; startFaceI < size(); startFaceI++)
931 if (faceZone[startFaceI] == -1)
937 if (startFaceI >= size())
942 faceZone[startFaceI] = zoneI;
944 markZone(borderEdge, startFaceI, zoneI, faceZone);
971 if (include[oldFacei])
974 faceMap[faceI++] = oldFacei;
983 pointMap[pointI++] = a;
990 pointMap[pointI++] =
b;
997 pointMap[pointI++] = c;
1020 subsetMeshMap(include, pointMap, faceMap);
1028 newPoints[pointi] = locPoints[pointMap[pointi]];
1029 oldToNew[pointMap[pointi]] = pointi;
1038 const labelledTri& tri = locFaces[faceMap[facei]];
1040 newTriangles[facei][0] = oldToNew[tri[0]];
1041 newTriangles[facei][1] = oldToNew[tri[1]];
1042 newTriangles[facei][2] = oldToNew[tri[2]];
1043 newTriangles[facei].region() = tri.region();
1051 void Foam::triSurface::write
1054 const bool sortByRegion
1057 write(name, name.
ext(), sortByRegion);
1070 os.
check(
"triSurface::write(Ostream&)");
1074 void Foam::triSurface::write(
const Time&
d)
const
1078 fileName foamPath(d.
path()/triSurfInstance(d)/typeName/foamFile);
1101 label pointI = f[fp];
1102 if (pointIsUsed.
set(pointI, 1))
1111 os <<
"Triangles : " << size() <<
endl
1112 <<
"Vertices : " << nPoints <<
endl
1113 <<
"Bounding Box : " << bb <<
endl;
1123 storedPoints() = ts.
points();