40 namespace searchableSurfaceModifiers
59 nTris += fcs[i].size()-2;
62 DynamicList<labelledTri> tris(nTris);
66 const face&
f = fcs[i];
68 for (
label fp = 1; fp <
f.size()-1; fp++)
70 tris.append(labelledTri(
f[0],
f[fp],
f[
f.fcIndex(fp)], i));
76 patches[patchI] = geometricSurfacePatch
83 cutSurf = triSurface(tris.xfer(),
patches, pts.xfer());
89 const searchableSurface& cutter,
93 if (isA<searchableBox>(cutter))
95 const searchableBox& bb = refCast<const searchableBox>(cutter);
102 else if (isA<searchableRotatedBox>(cutter))
104 const searchableRotatedBox& bb =
105 refCast<const searchableRotatedBox>(cutter);
112 else if (isA<triSurfaceMesh>(cutter))
114 return const_cast<triSurfaceMesh&
>
116 refCast<const triSurfaceMesh>(cutter)
122 <<
"Triangulation only supported for triSurfaceMesh, searchableBox"
123 <<
", not for surface " << cutter.name()
124 <<
" of type " << cutter.type()
126 return const_cast<triSurfaceMesh&
>
128 refCast<const triSurfaceMesh>(cutter)
139 edgeIntersections& edgeCuts1,
141 edgeIntersections& edgeCuts2
144 bool hasMoved1 =
false;
145 bool hasMoved2 =
false;
147 for (
label iter = 0; iter < 10; iter++)
149 Info<<
"Determining intersections of surf1 edges with surf2"
157 triSurfaceSearch querySurf2(surf2);
165 edgeCuts1 = edgeIntersections
177 edgeCuts1.removeDegenerates
189 surf1.movePoints(points1);
195 Info<<
"Determining intersections of surf2 edges with surf1"
200 triSurfaceSearch querySurf1(surf1);
208 edgeCuts2 = edgeIntersections
220 edgeCuts2.removeDegenerates
232 surf2.movePoints(points2);
239 if (nIters1 == 0 && nIters2 == 0)
263 return hasMoved1 || hasMoved2;
271 const searchableSurfaces& geometry,
272 const dictionary&
dict
275 searchableSurfaceModifier(geometry,
dict),
276 cutterNames_(dict_.
lookup(
"cutters"))
291 searchableSurface& geom
294 triSurface& surf = refCast<triSurfaceMesh>(geom);
296 bool changed =
false;
299 forAll(cutterNames_, cutNameI)
302 findStrings(cutterNames_[cutNameI], geometry_.names());
306 label geomI = geomIDs[j];
307 const searchableSurface& cutter = geometry_[geomI];
311 triSurface& cutSurf = triangulate(cutter, work);
314 edgeIntersections edge1Cuts;
315 edgeIntersections edge2Cuts;
326 surfaceIntersection inter(surf, edge1Cuts, cutSurf, edge2Cuts);
330 intersectedSurface surf3(surf,
true, inter);
335 cutter.getVolumeType(surf3.faceCentres(), volTypes);
347 if (nInside > 0 && surf3.patches().size() > 0)
350 label sz = newPatches.size();
351 newPatches.setSize(sz+1);
352 newPatches[sz] = geometricSurfacePatch
354 newPatches[sz-1].geometricType(),
355 newPatches[sz-1].
name() +
"_inside",
356 newPatches[sz-1].index()
359 Info<<
"Moving " << nInside <<
" out of " << surf3.size()
360 <<
" triangles to region "
361 << newPatches[sz].name() <<
endl;
369 newTris[i].region() = sz;
373 surf = triSurface(newTris.xfer(), newPatches, newPoints.xfer());