@@ -57,6 +57,17 @@ namespace
5757 model.component_mesh_vertices ( edge_unique_vertices[1 ] ), type );
5858 }
5959
60+ template < class ModelType >
61+ geode::ComponentMeshVertexPairs model_edge_pairs ( const ModelType& model,
62+ const std::array< geode::index_t , 2 >& edge_unique_vertices,
63+ const geode::ComponentID& component )
64+ {
65+ return geode::component_mesh_vertex_pairs (
66+ model.component_mesh_vertices ( edge_unique_vertices[0 ] ),
67+ model.component_mesh_vertices ( edge_unique_vertices[1 ] ),
68+ component );
69+ }
70+
6071 template < class ModelType >
6172 std::array< geode::index_t , 2 > edge_unique_vertices (
6273 const ModelType& model,
@@ -146,6 +157,41 @@ namespace geode
146157 return edges;
147158 }
148159
160+ template < typename Model >
161+ std::vector< index_t > line_component_mesh_edges ( const Model& model,
162+ const std::array< geode::index_t , 2 >& edge_unique_vertices,
163+ const Line< Model::dim >& line )
164+ {
165+ if ( edge_unique_vertices[0 ] == NO_ID
166+ || edge_unique_vertices[1 ] == NO_ID )
167+ {
168+ return {};
169+ }
170+ const auto line_pairs = model_edge_pairs (
171+ model, edge_unique_vertices, line.component_id () );
172+ if ( !line_pairs.contains ( line.component_id () ) )
173+ {
174+ return {};
175+ }
176+ std::vector< index_t > edges;
177+ const auto & mesh = line.mesh ();
178+ for ( const auto & pair : line_pairs.at ( line.component_id () ) )
179+ {
180+ for ( const auto & edge_vertex :
181+ mesh.edges_around_vertex ( pair[0 ] ) )
182+ {
183+ const auto opposite_vertex =
184+ mesh.edge_vertex ( edge_vertex.opposite () );
185+ if ( opposite_vertex == pair[1 ] )
186+ {
187+ edges.emplace_back ( edge_vertex.edge_id );
188+ }
189+ }
190+ }
191+ geode::sort_unique ( edges );
192+ return edges;
193+ }
194+
149195 template < typename Model >
150196 geode::ModelComponentMeshEdges::SurfaceEdges
151197 surface_component_mesh_edges ( const Model& model,
@@ -165,11 +211,11 @@ namespace geode
165211 }
166212 geode::ModelComponentMeshEdges::SurfaceEdges edges;
167213 edges.reserve ( surface_pairs.size () );
168- for ( const auto & surface_pair : surface_pairs )
214+ for ( const auto & [surface_id, edge_pairs] : surface_pairs )
169215 {
170- const auto & surface = model.surface ( surface_pair. first .id () );
216+ const auto & surface = model.surface ( surface_id .id () );
171217 const auto & mesh = surface.mesh ();
172- for ( const auto & pair : surface_pair. second )
218+ for ( const auto & pair : edge_pairs )
173219 {
174220 if ( auto edge = mesh.polygon_edge_from_vertices (
175221 pair[0 ], pair[1 ] ) )
@@ -190,6 +236,43 @@ namespace geode
190236 return edges;
191237 }
192238
239+ template < typename Model >
240+ std::vector< PolygonEdge > surface_component_mesh_edges (
241+ const Model& model,
242+ const std::array< geode::index_t , 2 >& edge_unique_vertices,
243+ const Surface< Model::dim >& surface )
244+ {
245+ if ( edge_unique_vertices[0 ] == NO_ID
246+ || edge_unique_vertices[1 ] == NO_ID )
247+ {
248+ return {};
249+ }
250+ const auto surface_pairs = model_edge_pairs (
251+ model, edge_unique_vertices, surface.component_id () );
252+ if ( !surface_pairs.contains ( surface.component_id () ) )
253+ {
254+ return {};
255+ }
256+ std::vector< PolygonEdge > edges;
257+ const auto & mesh = surface.mesh ();
258+ for ( const auto & pair : surface_pairs.at ( surface.component_id () ) )
259+ {
260+ if ( auto edge =
261+ mesh.polygon_edge_from_vertices ( pair[0 ], pair[1 ] ) )
262+ {
263+ edges.emplace_back ( std::move ( edge.value () ) );
264+ continue ;
265+ }
266+ if ( auto edge =
267+ mesh.polygon_edge_from_vertices ( pair[1 ], pair[0 ] ) )
268+ {
269+ edges.emplace_back ( std::move ( edge.value () ) );
270+ }
271+ }
272+ geode::sort_unique ( edges );
273+ return edges;
274+ }
275+
193276 geode::BRepComponentMeshEdges::BlockEdges block_component_mesh_edges (
194277 const geode::BRep& model,
195278 const std::array< geode::index_t , 2 >& edge_unique_vertices )
@@ -224,6 +307,36 @@ namespace geode
224307 filter_edges ( edges );
225308 return edges;
226309 }
310+
311+ std::vector< PolyhedronFacetEdge > block_component_mesh_edges (
312+ const geode::BRep& model,
313+ const std::array< geode::index_t , 2 >& edge_unique_vertices,
314+ const geode::Block3D& block )
315+ {
316+ if ( edge_unique_vertices[0 ] == NO_ID
317+ || edge_unique_vertices[1 ] == NO_ID )
318+ {
319+ return {};
320+ }
321+ const auto block_pairs = model_edge_pairs (
322+ model, edge_unique_vertices, block.component_id () );
323+ if ( !block_pairs.contains ( block.component_id () ) )
324+ {
325+ return {};
326+ }
327+ std::vector< PolyhedronFacetEdge > edges;
328+ const auto & mesh = block.mesh ();
329+ for ( const auto & pair : block_pairs.at ( block.component_id () ) )
330+ {
331+ if ( auto edge = mesh.polyhedron_facet_edge_from_vertices (
332+ { pair[0 ], pair[1 ] } ) )
333+ {
334+ edges.emplace_back ( std::move ( edge.value () ) );
335+ }
336+ }
337+ geode::sort_unique ( edges );
338+ return edges;
339+ }
227340 } // namespace detail
228341
229342 std::array< index_t , 2 > edge_unique_vertices (
@@ -321,11 +434,28 @@ namespace geode
321434 line_component_mesh_edges (
322435 const BRep&, const std::array< index_t , 2 >& );
323436
437+ template std::vector< index_t >
438+ opengeode_model_api line_component_mesh_edges ( const Section&,
439+ const std::array< index_t , 2 >&,
440+ const Line2D& );
441+ template std::vector< index_t >
442+ opengeode_model_api line_component_mesh_edges (
443+ const BRep&, const std::array< index_t , 2 >&, const Line3D& );
444+
324445 template ModelComponentMeshEdges::SurfaceEdges opengeode_model_api
325446 surface_component_mesh_edges (
326447 const Section&, const std::array< index_t , 2 >& );
327448 template ModelComponentMeshEdges::SurfaceEdges opengeode_model_api
328449 surface_component_mesh_edges (
329450 const BRep&, const std::array< index_t , 2 >& );
451+
452+ template std::vector< PolygonEdge >
453+ opengeode_model_api surface_component_mesh_edges ( const Section&,
454+ const std::array< index_t , 2 >&,
455+ const Surface2D& );
456+ template std::vector< PolygonEdge >
457+ opengeode_model_api surface_component_mesh_edges ( const BRep&,
458+ const std::array< index_t , 2 >&,
459+ const Surface3D& );
330460 } // namespace detail
331461} // namespace geode
0 commit comments