@@ -298,60 +298,52 @@ namespace geode
298298 }
299299 const auto cme = geode::component_mesh_edges (
300300 brep_, brep_.line ( cmv.component_id .id () ), 0 );
301- if ( brep_.nb_incidences ( cmv.component_id .id () ) >= 1 )
301+ for ( const auto & incident_surface :
302+ brep_.incidences ( brep_.line ( cmv.component_id .id () ) ) )
302303 {
303- for ( const auto & incident_surface :
304- brep_.incidences ( brep_.line ( cmv.component_id .id () ) ) )
304+ if ( !cme.surface_edges .contains ( incident_surface.id () ) )
305305 {
306- if ( !cme.surface_edges .contains ( incident_surface.id () ) )
307- {
308- return absl::StrCat ( " Unique vertex with index " ,
309- unique_vertex_index, " is part of line with uuid '" ,
310- cmv.component_id .id ().string (),
311- " ', which should be boundary of "
312- " surface with uuid '" ,
313- incident_surface.id ().string () );
314- }
315- const auto & surface_edges =
316- cme.surface_edges .at ( incident_surface.id () );
317- if ( surface_edges.size () != 1 )
318- {
319- return absl::StrCat ( " Unique vertex with index " ,
320- unique_vertex_index, " is part of line with uuid '" ,
321- cmv.component_id .id ().string (),
322- " ', which should not be boundary of "
323- " surface with uuid '" ,
324- incident_surface.id ().string () );
325- }
306+ return absl::StrCat ( " Unique vertex with index " ,
307+ unique_vertex_index, " is part of line with uuid '" ,
308+ cmv.component_id .id ().string (),
309+ " ', which should be boundary of "
310+ " surface with uuid '" ,
311+ incident_surface.id ().string () );
312+ }
313+ const auto & surface_edges =
314+ cme.surface_edges .at ( incident_surface.id () );
315+ if ( surface_edges.size () != 1 )
316+ {
317+ return absl::StrCat ( " Unique vertex with index " ,
318+ unique_vertex_index, " is part of line with uuid '" ,
319+ cmv.component_id .id ().string (),
320+ " ', which should not be boundary of "
321+ " surface with uuid '" ,
322+ incident_surface.id ().string () );
326323 }
327324 }
328- if ( brep_.nb_embedding_surfaces (
329- brep_.line ( cmv.component_id .id () ) )
330- >= 1 )
325+ for ( const auto & embedding_surface : brep_.embedding_surfaces (
326+ brep_.line ( cmv.component_id .id () ) ) )
331327 {
332- for ( const auto & embedding_surface : brep_.embedding_surfaces (
333- brep_.line ( cmv.component_id .id () ) ) )
328+ if ( !cme.surface_edges .contains ( embedding_surface.id () ) )
334329 {
335- if ( !cme.surface_edges .contains ( embedding_surface.id () ) )
336- {
337- return absl::StrCat ( " Unique vertex with index " ,
338- unique_vertex_index, " is part of line with uuid '" ,
339- cmv.component_id .id ().string (),
340- " ', which should not be embedded in "
341- " surface with uuid '" ,
342- embedding_surface.id ().string () );
343- }
344- const auto & surface_edges =
345- cme.surface_edges .at ( embedding_surface.id () );
346- if ( surface_edges.size () <= 1 )
347- {
348- return absl::StrCat ( " Unique vertex with index " ,
349- unique_vertex_index, " is part of line with uuid '" ,
350- cmv.component_id .id ().string (),
351- " ', which should not be embedded in "
352- " surface with uuid '" ,
353- embedding_surface.id ().string () );
354- }
330+ return absl::StrCat ( " Unique vertex with index " ,
331+ unique_vertex_index, " is part of line with uuid '" ,
332+ cmv.component_id .id ().string (),
333+ " ', which should not be embedded in "
334+ " surface with uuid '" ,
335+ embedding_surface.id ().string () );
336+ }
337+ const auto & surface_edges =
338+ cme.surface_edges .at ( embedding_surface.id () );
339+ if ( surface_edges.size () <= 1 )
340+ {
341+ return absl::StrCat ( " Unique vertex with index " ,
342+ unique_vertex_index, " is part of line with uuid '" ,
343+ cmv.component_id .id ().string (),
344+ " ', which should not be embedded in "
345+ " surface with uuid '" ,
346+ embedding_surface.id ().string () );
355347 }
356348 }
357349 if ( brep_.nb_incidences ( cmv.component_id .id () ) < 1
@@ -404,6 +396,59 @@ namespace geode
404396 return std::nullopt ;
405397 }
406398
399+ std::optional< std::string >
400+ BRepLinesTopology::line_edge_has_wrong_component_edges_around (
401+ const Line3D& line, const index_t edge_index ) const
402+ {
403+ const auto cme = component_mesh_edges ( brep_, line, edge_index );
404+ for ( const auto & [surface_id, surface_edges] : cme.surface_edges )
405+ {
406+ if ( brep_.is_boundary ( line, brep_.surface ( surface_id ) ) )
407+ {
408+ if ( surface_edges.size () != 1 )
409+ {
410+ return absl::StrCat ( " Line with uuid '" , line.id ().string (),
411+ " ' is boundary of surface with uuid '" ,
412+ surface_id.string (), " ', but has " ,
413+ surface_edges.size (),
414+ " edges of this surface around it, it should be 1." );
415+ }
416+ continue ;
417+ }
418+ if ( brep_.is_internal ( line, brep_.surface ( surface_id ) ) )
419+ {
420+ if ( surface_edges.size () != 2 )
421+ {
422+ return absl::StrCat ( " Line with uuid '" , line.id ().string (),
423+ " ' is internal to surface with uuid '" ,
424+ surface_id.string (), " ', but has " ,
425+ surface_edges.size (),
426+ " edges of this surface around it, it should be 2." );
427+ }
428+ continue ;
429+ }
430+ return absl::StrCat ( " Line with uuid '" , line.id ().string (),
431+ " ' has edge with id " , edge_index,
432+ " in common with surface with uuid '" , surface_id.string (),
433+ " ', but is neither boundary of nor internal to it." );
434+ }
435+ for ( const auto & [block_id, block_edges] : cme.block_edges )
436+ {
437+ if ( brep_.is_internal ( line, brep_.block ( block_id ) ) )
438+ {
439+ if ( block_edges.size () != 1 )
440+ {
441+ return absl::StrCat ( " Line with uuid '" , line.id ().string (),
442+ " ' is internal to block with uuid '" , block_id.string (),
443+ " ', but has " , block_edges.size (),
444+ " edges of this surface around it, it should be 1." );
445+ }
446+ continue ;
447+ }
448+ }
449+ return std::nullopt ;
450+ }
451+
407452 BRepLinesTopologyInspectionResult
408453 BRepLinesTopology::inspect_lines_topology () const
409454 {
@@ -427,6 +472,24 @@ namespace geode
427472 result.lines_not_linked_to_a_unique_vertex .add_issues_to_map (
428473 line.id (), std::move ( line_result ) );
429474 }
475+ InspectionIssues< index_t > line_edges_with_wrong_cme{ absl::StrCat (
476+ " Line " , line.id ().string () ) };
477+ for ( const auto edge_id : Range{ line.mesh ().nb_edges () } )
478+ {
479+ if ( const auto problem_message =
480+ line_edge_has_wrong_component_edges_around (
481+ line, edge_id ) )
482+ {
483+ line_edges_with_wrong_cme.add_issue (
484+ edge_id, problem_message.value () );
485+ }
486+ }
487+ if ( line_edges_with_wrong_cme.nb_issues () != 0 )
488+ {
489+ result.line_edges_with_wrong_component_edges_around
490+ .add_issues_to_map (
491+ line.id (), std::move ( line_edges_with_wrong_cme ) );
492+ }
430493 }
431494 for ( const auto unique_vertex_id : Range{ brep_.nb_unique_vertices () } )
432495 {
0 commit comments