Skip to content

Commit d12e552

Browse files
authored
Add cutMeshByPolyline function. (#4227)
* Add `cutMeshByPolyline` function. * Remove unused parameters. * PR fixes. * Grammar. * Make parallel and check cut. * PR fixes.
1 parent c34e2f3 commit d12e552

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

source/MRMesh/MRContoursCut.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "MRContoursCut.h"
22
#include "MRAffineXf3.h"
33
#include "MRMesh.h"
4+
#include "MRPolyline.h"
45
#include "MRTriangleIntersection.h"
56
#include "MRMeshTopology.h"
67
#include "MRMeshDelone.h"
@@ -2190,6 +2191,37 @@ CutMeshResult cutMesh( Mesh& mesh, const OneMeshContours& contours, const CutMes
21902191
return res;
21912192
}
21922193

2194+
Expected<FaceBitSet> cutMeshByContour( Mesh& mesh, const Contour3f& contour, const AffineXf3f& xf )
2195+
{
2196+
std::vector<MeshTriPoint> surfaceLine( contour.size() );
2197+
tbb::task_group_context ctx;
2198+
bool ok = true;
2199+
ParallelFor( (size_t)0, contour.size(), [&] ( size_t i )
2200+
{
2201+
PointOnFace projPt;
2202+
if ( !mesh.projectPoint( xf( contour[i] ), projPt ) )
2203+
{
2204+
if ( ctx.cancel_group_execution() )
2205+
ok = false;
2206+
return;
2207+
}
2208+
surfaceLine[i] = mesh.toTriPoint( projPt );
2209+
} );
2210+
if ( !ok )
2211+
return unexpected( "Cannot project point to mesh" );
2212+
2213+
auto meshContour = convertMeshTriPointsToMeshContour( mesh, surfaceLine );
2214+
if ( !meshContour )
2215+
return unexpected( "Cannot convert tri points to mesh contour: " + meshContour.error() );
2216+
2217+
auto cutRes = cutMesh( mesh, { *meshContour } );
2218+
if ( !cutRes.fbsWithCountourIntersections.none() )
2219+
return unexpected( "Cannot cut mesh because of contour self intersections" );
2220+
auto sideFbv = fillContourLeft( mesh.topology, cutRes.resultCut );
2221+
return sideFbv;
2222+
}
2223+
2224+
21932225
TEST( MRMesh, BooleanIntersectionsSort )
21942226
{
21952227
Mesh meshA;

source/MRMesh/MRContoursCut.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include "MRVector3.h"
4+
#include "MRAffineXf3.h"
45
#include "MRId.h"
56
#include "MRBitSet.h"
67
#include "MRIntersectionContour.h"
@@ -233,4 +234,11 @@ struct CutMeshResult
233234
*/
234235
MRMESH_API CutMeshResult cutMesh( Mesh& mesh, const OneMeshContours& contours, const CutMeshParameters& params = {} );
235236

237+
238+
/// Cuts \p mesh by \p contour by projecting all the points
239+
/// \param xf transformation from the CSYS of \p contour to the CSYS of \p mesh
240+
/// \note \p mesh is modified, see \ref cutMesh for info
241+
/// \return Faces to the left of the polyline
242+
MRMESH_API Expected<FaceBitSet> cutMeshByContour( Mesh& mesh, const Contour3f& contour, const AffineXf3f& xf = {} );
243+
236244
} //namespace MR

0 commit comments

Comments
 (0)