@@ -560,6 +560,24 @@ namespace
560560 unique_vertices, type );
561561 }
562562
563+ template < typename Model >
564+ geode::ComponentMeshVertexGeneric< 3 > model_polygon_pairs (
565+ const Model& model,
566+ const geode::PolygonVertices& polygon_unique_vertices,
567+ const geode::ComponentID& component )
568+ {
569+ std::vector< absl::Span< const geode::ComponentMeshVertex > >
570+ unique_vertices;
571+ unique_vertices.reserve ( polygon_unique_vertices.size () );
572+ for ( const auto polygon_unique_vertex : polygon_unique_vertices )
573+ {
574+ unique_vertices.emplace_back (
575+ model.component_mesh_vertices ( polygon_unique_vertex ) );
576+ }
577+ return geode::component_mesh_vertex_generic< 3 >(
578+ unique_vertices, component );
579+ }
580+
563581 template < typename Model >
564582 void model_component_mesh_polygons (
565583 geode::ModelComponentMeshPolygons& polygons,
@@ -673,6 +691,34 @@ namespace geode
673691 return polygons;
674692 }
675693
694+ std::vector< PolyhedronFacet > block_component_mesh_polygons (
695+ const BRep& model,
696+ const PolygonVertices& polygon_unique_vertices,
697+ const Block3D& block )
698+ {
699+ const auto block_pairs = model_polygon_pairs (
700+ model, polygon_unique_vertices, block.component_id () );
701+ if ( !block_pairs.contains ( block.component_id () ) )
702+ {
703+ return {};
704+ }
705+ std::vector< PolyhedronFacet > facets;
706+ const auto & mesh = block.mesh ();
707+ for ( const auto & pair : block_pairs.at ( block.component_id () ) )
708+ {
709+ if ( auto facet = mesh.polyhedron_facet_from_vertices ( pair ) )
710+ {
711+ facets.emplace_back ( std::move ( facet.value () ) );
712+ if ( auto adj =
713+ mesh.polyhedron_adjacent_facet ( facet.value () ) )
714+ {
715+ facets.emplace_back ( std::move ( adj.value () ) );
716+ }
717+ }
718+ }
719+ geode::sort_unique ( facets );
720+ return facets;
721+ }
676722 } // namespace detail
677723
678724 PolygonVertices polygon_unique_vertices (
0 commit comments