55 { pointStatus::CONVEX,
"convex" },
56 { pointStatus::CONCAVE,
"concave" },
57 { pointStatus::MIXED,
"mixed" },
58 { pointStatus::NONFEATURE,
"nonFeature" },
68 { edgeStatus::EXTERNAL,
"external" },
69 { edgeStatus::INTERNAL,
"internal" },
70 { edgeStatus::FLAT,
"flat" },
71 { edgeStatus::OPEN,
"open" },
72 { edgeStatus::MULTIPLE,
"multiple" },
73 { edgeStatus::NONE,
"none" },
83 { sideVolumeType::INSIDE,
"inside" },
84 { sideVolumeType::OUTSIDE,
"outside" },
85 { sideVolumeType::BOTH,
"both" },
86 { sideVolumeType::NEITHER,
"neither" },
103 return wordHashSet(*fileExtensionConstructorTablePtr_);
109 return wordHashSet(*writefileExtensionMemberFunctionTablePtr_);
115 return edgeMeshFormatsCore::checkSupport
127 return edgeMeshFormatsCore::checkSupport
144 return canReadType(ext, verbose);
156 const labelList& ptEds(pointEdges()[ptI]);
158 label nPtEds = ptEds.size();
170 edgeStatus edStat = getEdgeStatus(ptEds[i]);
172 if (edStat == EXTERNAL)
176 else if (edStat == INTERNAL)
182 if (nExternal == nPtEds)
186 else if (nInternal == nPtEds)
197 const searchableSurface& surf,
206 const edgeList& edges = this->edges();
210 List<List<pointIndexHit>> edgeHits(edges.size());
216 const edge&
e = edges[edgeI];
220 surf.findLineAll(start,
end, edgeHits);
227 nHits += edgeHits[edgeI].size();
230 DynamicField<point> newPoints(
points);
233 newPoints.setCapacity(newPoints.size()+nHits);
234 newToOldPoint.setCapacity(newPoints.capacity());
236 DynamicList<edge> newEdges(edges);
237 DynamicList<label> newToOldEdge(
identity(edges.size()));
239 newEdges.setCapacity(newEdges.size()+nHits);
240 newToOldEdge.setCapacity(newEdges.capacity());
243 DynamicList<label> dynPointsFromEdge(nHits);
244 DynamicList<label> dynOldEdge(nHits);
245 DynamicList<label> dynSurfTri(nHits);
249 const List<pointIndexHit>& eHits = edgeHits[edgeI];
253 label prevPtI = edges[edgeI][0];
256 label newPtI = newPoints.size();
258 newPoints.append(eHits[eHitI].hitPoint());
259 newToOldPoint.append(edges[edgeI][0]);
260 dynPointsFromEdge.append(newPtI);
261 dynOldEdge.append(edgeI);
262 dynSurfTri.append(eHits[eHitI].index());
266 newEdges[edgeI] = edge(prevPtI, newPtI);
270 newEdges.append(edge(prevPtI, newPtI));
271 newToOldEdge.append(edgeI);
275 newEdges.append(edge(prevPtI, edges[edgeI][1]));
276 newToOldEdge.append(edgeI);
282 pointMap.transfer(newToOldPoint);
286 edgeMap.transfer(newToOldEdge);
288 pointsFromEdge.transfer(dynPointsFromEdge);
289 oldEdge.transfer(dynOldEdge);
290 surfTri.transfer(dynSurfTri);
293 autoMap(
allPoints, allEdges, pointMap, edgeMap);
305 const edgeList& edges = this->edges();
312 forAll(edgeCentres, edgeI)
314 const edge&
e = edges[edgeI];
315 edgeCentres[edgeI] =
e.centre(
points);
317 List<volumeType> volTypes;
322 label compactEdgeI = 0;
326 if (volTypes[edgeI] == volType)
328 edgeMap[compactEdgeI++] = edgeI;
337 const edge&
e = edges[edgeMap[i]];
343 label compactPointI = 0;
344 forAll(pointToCompact, pointI)
346 if (pointToCompact[pointI] != -1)
348 pointToCompact[pointI] = compactPointI;
349 pointMap[compactPointI++] = pointI;
352 pointMap.
setSize(compactPointI);
359 const edge&
e = edges[edgeMap[i]];
360 subEdges[i][0] = pointToCompact[
e[0]];
361 subEdges[i][1] = pointToCompact[
e[1]];
365 autoMap(subPoints, subEdges, pointMap, edgeMap);
388 normalVolumeTypes_(0),
390 normalDirections_(0),
392 featurePointNormals_(0),
393 featurePointEdges_(0),
406 nonFeatureStart_(-1),
412 normalVolumeTypes_(0),
414 normalDirections_(0),
416 featurePointNormals_(0),
417 featurePointEdges_(0),
428 concaveStart_(fem.concaveStart()),
429 mixedStart_(fem.mixedStart()),
430 nonFeatureStart_(fem.nonFeatureStart()),
431 internalStart_(fem.internalStart()),
432 flatStart_(fem.flatStart()),
433 openStart_(fem.openStart()),
434 multipleStart_(fem.multipleStart()),
435 normals_(fem.normals()),
436 normalVolumeTypes_(fem.normalVolumeTypes()),
437 edgeDirections_(fem.edgeDirections()),
438 normalDirections_(fem.normalDirections()),
439 edgeNormals_(fem.edgeNormals()),
440 featurePointNormals_(fem.featurePointNormals()),
441 featurePointEdges_(fem.featurePointEdges()),
442 regionEdges_(fem.regionEdges()),
463 this->storedPoints() =
points;
464 this->storedEdges() = edges;
477 this->storedEdges().transfer(edges);
490 const triSurface& surf = sFeat.
surface();
507 normalVolumeTypes_.
setSize(normals_.size());
516 label sFEI = featureEdges[i];
519 const labelList& eFaces = edgeFaces[sFEI];
523 label eFI = eFaces[j];
528 normalVolumeTypes_[nAdded++] =
530 surfBaffleRegions[surf[eFI].region()]
544 const PrimitivePatch<faceList, pointField>& surf,
550 extendedEdgeMesh(one::minus{})
568 label nonFeatureStart,
584 concaveStart_(concaveStart),
585 mixedStart_(mixedStart),
586 nonFeatureStart_(nonFeatureStart),
587 internalStart_(internalStart),
588 flatStart_(flatStart),
589 openStart_(openStart),
590 multipleStart_(multipleStart),
592 normalVolumeTypes_(normalVolumeTypes),
593 edgeDirections_(edgeDirections),
594 normalDirections_(normalDirections),
595 edgeNormals_(edgeNormals),
596 featurePointNormals_(featurePointNormals),
597 featurePointEdges_(featurePointEdges),
598 regionEdges_(regionEdges),
633 return read(unzipName, unzipName.
ext());
642 const fileName&
name,
647 transfer(*
New(
name, fileType));
655 scalar searchDistSqr,
659 info = pointTree().findNearest
670 scalar searchDistSqr,
674 info = edgeTree().findNearest
707 List<pointIndexHit>& info
710 const PtrList<indexedOctree<treeDataEdge>>& edgeTrees = edgeTreesByType();
712 info.setSize(edgeTrees.size());
716 sliceStarts[0] = externalStart_;
717 sliceStarts[1] = internalStart_;
718 sliceStarts[2] = flatStart_;
719 sliceStarts[3] = openStart_;
720 sliceStarts[4] = multipleStart_;
724 info[i] = edgeTrees[i].findNearest
734 info[i].setIndex(info[i].index() + sliceStarts[i]);
742 scalar searchRadiusSqr,
743 List<pointIndexHit>& info
753 DynamicList<pointIndexHit> dynPointHit(elems.size());
757 label index = elems[elemI];
758 label ptI = pointTree().shapes().pointLabels()[index];
763 dynPointHit.append(nearHit);
766 info.transfer(dynPointHit);
773 const scalar searchRadiusSqr,
774 List<pointIndexHit>& info
777 const PtrList<indexedOctree<treeDataEdge>>& edgeTrees = edgeTreesByType();
779 info.setSize(edgeTrees.size());
783 sliceStarts[0] = externalStart_;
784 sliceStarts[1] = internalStart_;
785 sliceStarts[2] = flatStart_;
786 sliceStarts[3] = openStart_;
787 sliceStarts[4] = multipleStart_;
789 DynamicList<pointIndexHit> dynEdgeHit(edgeTrees.size()*3);
795 labelList elems = edgeTrees[i].findSphere
803 label index = elems[elemI];
804 label edgeI = edgeTrees[i].shapes().edgeLabels()[index];
805 const edge&
e = edges()[edgeI];
809 label hitIndex = index + sliceStarts[i];
818 dynEdgeHit.append(nearHit);
822 info.transfer(dynEdgeHit);
847 new indexedOctree<treeDataPoint>
887 new indexedOctree<treeDataEdge>
911 if (edgeTreesByType_.empty())
929 identity((internalStart_ - externalStart_), externalStart_);
932 sliceEdges[1] =
identity((flatStart_ - internalStart_), internalStart_);
935 sliceEdges[2] =
identity((openStart_ - flatStart_), flatStart_);
938 sliceEdges[3] =
identity((multipleStart_ - openStart_), openStart_);
942 identity((edges().size() - multipleStart_), multipleStart_);
945 edgeTreesByType_.resize(nEdgeTypes);
947 forAll(edgeTreesByType_, i)
952 new indexedOctree<treeDataEdge>
970 return edgeTreesByType_;
983 concaveStart_ =
mesh.concaveStart_;
984 mixedStart_ =
mesh.mixedStart_;
985 nonFeatureStart_ =
mesh.nonFeatureStart_;
986 internalStart_ =
mesh.internalStart_;
987 flatStart_ =
mesh.flatStart_;
988 openStart_ =
mesh.openStart_;
989 multipleStart_ =
mesh.multipleStart_;
991 normalVolumeTypes_.transfer(
mesh.normalVolumeTypes_);
992 edgeDirections_.transfer(
mesh.edgeDirections_);
993 normalDirections_.transfer(
mesh.normalDirections_);
994 edgeNormals_.transfer(
mesh.edgeNormals_);
995 featurePointNormals_.transfer(
mesh.featurePointNormals_);
996 featurePointEdges_.transfer(
mesh.featurePointEdges_);
997 regionEdges_.transfer(
mesh.regionEdges_);
998 pointTree_ = std::move(
mesh.pointTree_);
999 edgeTree_ = std::move(
mesh.edgeTree_);
1000 edgeTreesByType_.transfer(
mesh.edgeTreesByType_);
1011 nonFeatureStart_ = 0;
1017 normalVolumeTypes_.clear();
1018 edgeDirections_.clear();
1019 normalDirections_.clear();
1020 edgeNormals_.clear();
1021 featurePointNormals_.clear();
1022 featurePointEdges_.clear();
1023 regionEdges_.clear();
1024 pointTree_.reset(
nullptr);
1025 edgeTree_.reset(
nullptr);
1026 edgeTreesByType_.clear();
1040 for (label i = 0; i < concaveStart(); i++)
1051 for (label i = concaveStart(); i < mixedStart(); i++)
1062 for (label i = mixedStart(); i < nonFeatureStart(); i++)
1073 for (label i = nonFeatureStart(); i <
points().size(); i++)
1083 newPoints.rmap(
points(), reversePointMap);
1084 newPoints.rmap(fem.
points(), reverseFemPointMap);
1091 labelList reverseEdgeMap(edges().size());
1096 for (label i = 0; i < internalStart(); i++)
1098 reverseEdgeMap[i] = newEdgeI++;
1102 reverseFemEdgeMap[i] = newEdgeI++;
1106 label newInternalStart = newEdgeI;
1107 for (label i = internalStart(); i < flatStart(); i++)
1109 reverseEdgeMap[i] = newEdgeI++;
1113 reverseFemEdgeMap[i] = newEdgeI++;
1117 label newFlatStart = newEdgeI;
1118 for (label i = flatStart(); i < openStart(); i++)
1120 reverseEdgeMap[i] = newEdgeI++;
1124 reverseFemEdgeMap[i] = newEdgeI++;
1128 label newOpenStart = newEdgeI;
1129 for (label i = openStart(); i < multipleStart(); i++)
1131 reverseEdgeMap[i] = newEdgeI++;
1135 reverseFemEdgeMap[i] = newEdgeI++;
1139 label newMultipleStart = newEdgeI;
1140 for (label i = multipleStart(); i < edges().size(); i++)
1142 reverseEdgeMap[i] = newEdgeI++;
1146 reverseFemEdgeMap[i] = newEdgeI++;
1152 const edge&
e = edges()[i];
1153 newEdges[reverseEdgeMap[i]] = edge
1155 reversePointMap[
e[0]],
1156 reversePointMap[
e[1]]
1161 const edge&
e = fem.
edges()[i];
1162 newEdges[reverseFemEdgeMap[i]] = edge
1164 reverseFemPointMap[
e[0]],
1165 reverseFemPointMap[
e[1]]
1171 edgeDirections().size()
1174 newEdgeDirections.rmap(edgeDirections(), reverseEdgeMap);
1182 DynamicField<point> newNormals
1187 newNormals.append(normals());
1188 newNormals.append(fem.
normals());
1194 edgeNormals().size()
1198 UIndirectList<labelList>
1201 SubList<label>(reverseEdgeMap, edgeNormals().size())
1203 UIndirectList<labelList>
1206 SubList<label>(reverseFemEdgeMap, fem.
edgeNormals().size())
1211 const label mapI = reverseFemEdgeMap[i];
1215 en[j] += normals().size();
1223 featurePointNormals().size()
1228 UIndirectList<labelList>
1230 newFeaturePointNormals,
1231 SubList<label>(reversePointMap, featurePointNormals().size())
1232 ) = featurePointNormals();
1233 UIndirectList<labelList>
1235 newFeaturePointNormals,
1241 const label mapI = reverseFemPointMap[i];
1242 labelList& fn = newFeaturePointNormals[mapI];
1245 fn[j] += normals().size();
1251 DynamicList<label> newRegionEdges
1253 regionEdges().size()
1258 newRegionEdges.append(reverseEdgeMap[regionEdges()[i]]);
1262 newRegionEdges.append(reverseFemEdgeMap[fem.
regionEdges()[i]]);
1270 concaveStart_ = newConcaveStart;
1271 mixedStart_ = newMixedStart;
1272 nonFeatureStart_ = newNonFeatureStart;
1276 edgeMesh newmesh(std::move(newPoints), std::move(newEdges));
1281 internalStart_ = newInternalStart;
1282 flatStart_ = newFlatStart;
1283 openStart_ = newOpenStart;
1284 multipleStart_ = newMultipleStart;
1286 edgeDirections_.transfer(newEdgeDirections);
1288 normals_.transfer(newNormals);
1289 edgeNormals_.transfer(newEdgeNormals);
1290 featurePointNormals_.transfer(newFeaturePointNormals);
1292 regionEdges_.transfer(newRegionEdges);
1294 pointTree_.reset(
nullptr);
1295 edgeTree_.reset(
nullptr);
1296 edgeTreesByType_.clear();
1312 for (label i = concaveStart(); i < mixedStart(); i++)
1318 for (label i = 0; i < concaveStart(); i++)
1334 for (label i = internalStart(); i < flatStart(); i++)
1336 reverseEdgeMap[i] = newEdgeI++;
1339 label newInternalStart = newEdgeI;
1340 for (label i = 0; i < internalStart(); i++)
1342 reverseEdgeMap[i] = newEdgeI++;
1347 newPoints.rmap(
points(), reversePointMap);
1352 const edge&
e = edges()[i];
1353 newEdges[reverseEdgeMap[i]] = edge
1355 reversePointMap[
e[0]],
1356 reversePointMap[
e[1]]
1364 pointField newEdgeDirections(edges().size());
1365 newEdgeDirections.rmap(-1.0*edgeDirections(), reverseEdgeMap);
1370 UIndirectList<labelList>(newEdgeNormals, reverseEdgeMap) = edgeNormals();
1372 labelListList newFeaturePointNormals(featurePointNormals().size());
1375 UIndirectList<labelList>
1377 newFeaturePointNormals,
1378 SubList<label>(reversePointMap, featurePointNormals().size())
1379 ) = featurePointNormals();
1381 labelList newRegionEdges(regionEdges().size());
1384 newRegionEdges[i] = reverseEdgeMap[regionEdges()[i]];
1388 concaveStart_ = newConcaveStart;
1392 edgeMesh newmesh(std::move(newPoints), std::move(newEdges));
1397 internalStart_ = newInternalStart;
1399 edgeDirections_.transfer(newEdgeDirections);
1400 normals_.transfer(newNormals);
1401 edgeNormals_.transfer(newEdgeNormals);
1402 featurePointNormals_.transfer(newFeaturePointNormals);
1403 regionEdges_.transfer(newRegionEdges);
1405 pointTree_.reset(
nullptr);
1406 edgeTree_.reset(
nullptr);
1407 edgeTreesByType_.clear();
1420 label subIntStart = edgeMap.size();
1421 label subFlatStart = edgeMap.size();
1422 label subOpenStart = edgeMap.size();
1423 label subMultipleStart = edgeMap.size();
1425 forAll(edgeMap, subEdgeI)
1427 label edgeI = edgeMap[subEdgeI];
1428 if (edgeI >= internalStart() && subIntStart == edgeMap.size())
1430 subIntStart = subEdgeI;
1432 if (edgeI >= flatStart() && subFlatStart == edgeMap.size())
1434 subFlatStart = subEdgeI;
1436 if (edgeI >= openStart() && subOpenStart == edgeMap.size())
1438 subOpenStart = subEdgeI;
1440 if (edgeI >= multipleStart() && subMultipleStart == edgeMap.size())
1442 subMultipleStart = subEdgeI;
1449 label subConcaveStart = pointMap.size();
1450 label subMixedStart = pointMap.size();
1451 label subNonFeatStart = pointMap.size();
1453 forAll(pointMap, subPointI)
1455 label pointI = pointMap[subPointI];
1456 if (pointI >= concaveStart() && subConcaveStart == pointMap.size())
1458 subConcaveStart = subPointI;
1460 if (pointI >= mixedStart() && subMixedStart == pointMap.size())
1462 subMixedStart = subPointI;
1466 pointI >= nonFeatureStart()
1467 && subNonFeatStart == pointMap.size()
1470 subNonFeatStart = subPointI;
1479 bitSet isRegionEdge(edges().size(), regionEdges());
1481 DynamicList<label> newRegionEdges(regionEdges().size());
1482 forAll(edgeMap, subEdgeI)
1484 if (isRegionEdge.test(edgeMap[subEdgeI]))
1486 newRegionEdges.append(subEdgeI);
1489 subRegionEdges.transfer(newRegionEdges);
1494 if (featurePointEdges().size())
1496 subFeaturePointEdges.
setSize(subNonFeatStart);
1497 for (label subPointI = 0; subPointI < subNonFeatStart; subPointI++)
1499 label pointI = pointMap[subPointI];
1500 const labelList& pEdges = featurePointEdges()[pointI];
1502 labelList& subPEdges = subFeaturePointEdges[subPointI];
1503 subPEdges.
setSize(pEdges.size());
1509 subPEdges[i] = edgeMap[pEdges[i]];
1516 vectorField subEdgeDirections(edgeDirections(), edgeMap);
1519 labelList reverseNormalMap(normals().size(), -1);
1520 DynamicList<label> normalMap(normals().size());
1523 bitSet isSubNormal(normals().size());
1524 for (label subPointI = 0; subPointI < subNonFeatStart; subPointI++)
1526 label pointI = pointMap[subPointI];
1527 const labelList& pNormals = featurePointNormals()[pointI];
1529 isSubNormal.
set(pNormals);
1531 forAll(edgeMap, subEdgeI)
1533 label edgeI = edgeMap[subEdgeI];
1534 const labelList& eNormals = edgeNormals()[edgeI];
1536 isSubNormal.
set(eNormals);
1539 forAll(isSubNormal, normalI)
1541 if (isSubNormal.test(normalI))
1543 label subNormalI = normalMap.size();
1544 reverseNormalMap[normalI] = subNormalI;
1545 normalMap.append(subNormalI);
1554 if (normalDirections().size())
1556 subNormalDirections.
setSize(edgeMap.size());
1558 forAll(edgeMap, subEdgeI)
1560 label edgeI = edgeMap[subEdgeI];
1561 const labelList& eNormals = normalDirections()[edgeI];
1563 labelList& subNormals = subNormalDirections[subEdgeI];
1564 subNormals.
setSize(eNormals.size());
1567 if (eNormals[i] >= 0)
1569 subNormals[i] = reverseNormalMap[eNormals[i]];
1580 forAll(edgeMap, subEdgeI)
1582 label edgeI = edgeMap[subEdgeI];
1583 const labelList& eNormals = edgeNormals()[edgeI];
1584 labelList& subNormals = subEdgeNormals[subEdgeI];
1590 for (label subPointI = 0; subPointI < subNonFeatStart; subPointI++)
1592 label pointI = pointMap[subPointI];
1593 const labelList& pNormals = featurePointNormals()[pointI];
1594 labelList& subNormals = subPointNormals[subPointI];
1602 List<extendedEdgeMesh::sideVolumeType> subNormalVolumeTypes;
1603 if (normalVolumeTypes().size())
1605 subNormalVolumeTypes =
1606 UIndirectList<extendedEdgeMesh::sideVolumeType>
1608 normalVolumeTypes(),
1613 extendedEdgeMesh subMesh
1631 subNormalVolumeTypes,
1637 subNormalDirections,
1643 subFeaturePointEdges,
1677 const label nOldPoints =
points().size();
1683 select(surf, volType, subPointMap, subEdgeMap);
1694 edgeStat[edgeI] = getEdgeStatus(edgeI);
1696 forAll(pointStat, pointI)
1698 pointStat[pointI] = getPointStatus(pointI);
1702 labelList oldPointToIndex(nOldPoints, -1);
1703 forAll(pointsFromEdge, i)
1705 oldPointToIndex[pointsFromEdge[i]] = i;
1707 forAll(subPointMap, pointI)
1709 label oldPointI = subPointMap[pointI];
1710 label index = oldPointToIndex[oldPointI];
1713 pointStat[pointI] = classifyFeaturePoint(pointI);
1724 sortedToOriginalPoint,
1725 sortedToOriginalEdge
1729 pointMap =
labelUIndList(pointMap, sortedToOriginalPoint)();
1743 label pointConcaveStart;
1744 label pointMixedStart;
1745 label pointNonFeatStart;
1747 label edgeInternalStart;
1748 label edgeFlatStart;
1749 label edgeOpenStart;
1750 label edgeMultipleStart;
1755 sortedToOriginalPoint,
1756 sortedToOriginalEdge,
1771 forAll(sortedToOriginalPoint, sortedI)
1773 reversePointMap[sortedToOriginalPoint[sortedI]] = sortedI;
1776 edgeList sortedEdges(UIndirectList<edge>(edges(), sortedToOriginalEdge)());
1777 forAll(sortedEdges, sortedI)
1787 sortedToOriginalPoint,
1788 sortedToOriginalEdge
1792 concaveStart_ = pointConcaveStart;
1793 mixedStart_ = pointMixedStart;
1794 nonFeatureStart_ = pointNonFeatStart;
1795 internalStart_ = edgeInternalStart;
1796 flatStart_ = edgeFlatStart;
1797 openStart_ = edgeOpenStart;
1798 multipleStart_ = edgeMultipleStart;
1804 const scalar mergeDist,
1809 const label nOldPoints =
points().size();
1823 forAll(oldToMerged, oldI)
1825 label newI = oldToMerged[oldI];
1826 if (pointMap[newI] == -1)
1828 pointMap[newI] = oldI;
1836 const edge& oldE = edges()[edgeI];
1837 newEdges[edgeI] = edge(oldToMerged[oldE[0]], oldToMerged[oldE[1]]);
1850 List<edgeStatus> edgeStat(edges().size());
1853 edgeStat[edgeI] = getEdgeStatus(edgeI);
1856 List<pointStatus> pointStat(
points().size());
1857 forAll(pointStat, pointI)
1859 pointStat[pointI] = getPointStatus(pointI);
1864 forAll(oldToMerged, oldPointI)
1866 nPoints[oldToMerged[oldPointI]]++;
1873 pointStat[pointI] = classifyFeaturePoint(pointI);
1882 sortedToOriginalPoint,
1885 pointMap =
labelUIndList(pointMap, sortedToOriginalPoint)();
1887 return nNewPoints != nOldPoints;
1893 Info<<
nl <<
"Writing extendedEdgeMesh components to " << prefix
1899 OBJstream convexFtPtStr(prefix +
"_convexFeaturePts.obj");
1900 Info<<
"Writing " << concaveStart_
1901 <<
" convex feature points to " << convexFtPtStr.name() <<
endl;
1903 for(label i = 0; i < concaveStart_; i++)
1910 OBJstream concaveFtPtStr(prefix +
"_concaveFeaturePts.obj");
1911 Info<<
"Writing " << mixedStart_-concaveStart_
1912 <<
" concave feature points to "
1913 << concaveFtPtStr.name() <<
endl;
1915 for(label i = concaveStart_; i < mixedStart_; i++)
1922 OBJstream mixedFtPtStr(prefix +
"_mixedFeaturePts.obj");
1923 Info<<
"Writing " << nonFeatureStart_-mixedStart_
1924 <<
" mixed feature points to " << mixedFtPtStr.name() <<
endl;
1926 for(label i = mixedStart_; i < nonFeatureStart_; i++)
1933 OBJstream mixedFtPtStructureStr(prefix+
"_mixedFeaturePtsStructure.obj");
1935 << nonFeatureStart_-mixedStart_
1936 <<
" mixed feature point structure to "
1937 << mixedFtPtStructureStr.name() <<
endl;
1939 for(label i = mixedStart_; i < nonFeatureStart_; i++)
1941 const labelList& ptEds = pointEdges()[i];
1945 const edge&
e = edges()[ptEds[j]];
1946 mixedFtPtStructureStr.write
1956 OBJstream externalStr(prefix +
"_externalEdges.obj");
1957 Info<<
"Writing " << internalStart_-externalStart_
1958 <<
" external edges to " << externalStr.name() <<
endl;
1960 for (label i = externalStart_; i < internalStart_; i++)
1962 const edge&
e = edges()[i];
1968 OBJstream internalStr(prefix +
"_internalEdges.obj");
1969 Info<<
"Writing " << flatStart_-internalStart_
1970 <<
" internal edges to " << internalStr.name() <<
endl;
1972 for (label i = internalStart_; i < flatStart_; i++)
1974 const edge&
e = edges()[i];
1980 OBJstream flatStr(prefix +
"_flatEdges.obj");
1981 Info<<
"Writing " << openStart_-flatStart_
1982 <<
" flat edges to " << flatStr.name() <<
endl;
1984 for (label i = flatStart_; i < openStart_; i++)
1986 const edge&
e = edges()[i];
1992 OBJstream openStr(prefix +
"_openEdges.obj");
1993 Info<<
"Writing " << multipleStart_-openStart_
1994 <<
" open edges to " << openStr.name() <<
endl;
1996 for (label i = openStart_; i < multipleStart_; i++)
1998 const edge&
e = edges()[i];
2004 OBJstream multipleStr(prefix +
"_multipleEdges.obj");
2005 Info<<
"Writing " << edges().size()-multipleStart_
2006 <<
" multiple edges to " << multipleStr.name() <<
endl;
2008 for (label i = multipleStart_; i < edges().size(); i++)
2010 const edge&
e = edges()[i];
2016 OBJstream regionStr(prefix +
"_regionEdges.obj");
2017 Info<<
"Writing " << regionEdges_.size()
2018 <<
" region edges to " << regionStr.name() <<
endl;
2022 const edge&
e = edges()[regionEdges_[i]];
2028 OBJstream edgeDirsStr(prefix +
"_edgeDirections.obj");
2029 Info<<
"Writing " << edgeDirections_.size()
2030 <<
" edge directions to " << edgeDirsStr.name() <<
endl;
2032 forAll(edgeDirections_, i)
2034 const vector& eVec = edgeDirections_[i];
2035 const edge&
e = edges()[i];
2050 os <<
indent <<
"point classification :" <<
nl;
2052 os <<
indent <<
"convex feature points : "
2053 <<
setw(8) << concaveStart_-convexStart_
2056 os <<
indent <<
"concave feature points : "
2057 <<
setw(8) << mixedStart_-concaveStart_
2060 os <<
indent <<
"mixed feature points : "
2061 <<
setw(8) << nonFeatureStart_-mixedStart_
2064 os <<
indent <<
"other (non-feature) points : "
2065 <<
setw(8) <<
points().size()-nonFeatureStart_
2070 os <<
indent <<
"edge classification :" <<
nl;
2072 os <<
indent <<
"external (convex angle) edges : "
2073 <<
setw(8) << internalStart_-externalStart_
2076 os <<
indent <<
"internal (concave angle) edges : "
2077 <<
setw(8) << flatStart_-internalStart_
2080 os <<
indent <<
"flat region edges : "
2081 <<
setw(8) << openStart_-flatStart_
2085 <<
setw(8) << multipleStart_-openStart_
2088 os <<
indent <<
"multiply connected edges : "
2089 <<
setw(8) << edges().size()-multipleStart_
2104 label nEdNorms = edNorms.size();
2110 else if (nEdNorms == 2)
2112 const vector& n0(norms[edNorms[0]]);
2113 const vector& n1(norms[edNorms[1]]);
2115 if ((n0 & n1) > cosNormalAngleTol_)
2119 else if ((fC0tofC1 & n0) > 0.0)
2128 else if (nEdNorms > 2)
2145 label& pointConcaveStart,
2146 label& pointMixedStart,
2147 label& pointNonFeatStart,
2149 label& edgeInternalStart,
2150 label& edgeFlatStart,
2151 label& edgeOpenStart,
2152 label& edgeMultipleStart
2155 sortedToOriginalPoint.
setSize(pointStat.size());
2156 sortedToOriginalPoint = -1;
2158 sortedToOriginalEdge.
setSize(edgeStat.size());
2159 sortedToOriginalEdge = -1;
2170 forAll(pointStat, pointI)
2172 switch (pointStat[pointI])
2197 label convexStart = 0;
2198 label concaveStart = nConvex;
2199 label mixedStart = concaveStart+nConcave;
2200 label nonFeatStart = mixedStart+nMixed;
2204 pointConcaveStart = concaveStart;
2205 pointMixedStart = mixedStart;
2206 pointNonFeatStart = nonFeatStart;
2208 forAll(pointStat, pointI)
2210 switch (pointStat[pointI])
2213 sortedToOriginalPoint[convexStart++] = pointI;
2217 sortedToOriginalPoint[concaveStart++] = pointI;
2221 sortedToOriginalPoint[mixedStart++] = pointI;
2225 sortedToOriginalPoint[nonFeatStart++] = pointI;
2234 label nExternal = 0;
2235 label nInternal = 0;
2238 label nMultiple = 0;
2242 switch (edgeStat[edgeI])
2272 label externalStart = 0;
2273 label internalStart = nExternal;
2274 label flatStart = internalStart + nInternal;
2275 label openStart = flatStart + nFlat;
2276 label multipleStart = openStart + nOpen;
2280 edgeInternalStart = internalStart;
2281 edgeFlatStart = flatStart;
2282 edgeOpenStart = openStart;
2283 edgeMultipleStart = multipleStart;
2287 switch (edgeStat[edgeI])
2290 sortedToOriginalEdge[externalStart++] = edgeI;
2294 sortedToOriginalEdge[internalStart++] = edgeI;
2298 sortedToOriginalEdge[flatStart++] = edgeI;
2302 sortedToOriginalEdge[openStart++] = edgeI;
2306 sortedToOriginalEdge[multipleStart++] = edgeI;
2343 os << static_cast<label>(vt);
2352 os <<
"// points" <<
nl
2353 << em.points() <<
nl
2356 <<
"// concaveStart mixedStart nonFeatureStart" <<
nl
2359 << em.nonFeatureStart_ <<
nl
2360 <<
"// internalStart flatStart openStart multipleStart" <<
nl
2364 << em.multipleStart_ <<
nl
2365 <<
"// normals" <<
nl
2366 << em.normals_ <<
nl
2367 <<
"// normal volume types" <<
nl
2368 << em.normalVolumeTypes_ <<
nl
2369 <<
"// normalDirections" <<
nl
2370 << em.normalDirections_ <<
nl
2371 <<
"// edgeNormals" <<
nl
2372 << em.edgeNormals_ <<
nl
2373 <<
"// featurePointNormals" <<
nl
2374 << em.featurePointNormals_ <<
nl
2375 <<
"// featurePointEdges" <<
nl
2376 << em.featurePointEdges_ <<
nl
2377 <<
"// regionEdges" <<
nl
2389 is >>
static_cast<edgeMesh&
>(em)
2392 >> em.nonFeatureStart_
2393 >> em.internalStart_
2396 >> em.multipleStart_
2398 >> em.normalVolumeTypes_
2399 >> em.normalDirections_
2401 >> em.featurePointNormals_
2402 >> em.featurePointEdges_