Skip to content

fix(Topology): robustness and performance of the topology inspection - #200

Merged
BotellaA merged 12 commits into
nextfrom
fix/topology-review
Oct 15, 2026
Merged

BotellaA merged 12 commits into
nextfrom
fix/topology-review

Conversation

@BotellaA

Copy link
Copy Markdown
Member

Summary

Robustness and performance fixes for the BRep and Section topology inspections, from a review of OpenGeode-Inspector. There is one commit per fix. The tests are in tests/inspection/test-brep-topology.cpp and tests/inspection/test-section-topology.cpp.

Robustness

  • Copy-paste message: the non-bijective link issue reused the "linked to inexistant mesh vertex" message.
  • Swallowed exceptions: inspect_brep_topology and inspect_section_topology caught any OpenGeodeException from the corners, lines, surfaces or blocks inspection and silently left that whole result empty, so the model could be reported valid.
    • Each per unique vertex check now skips a vertex linked to a missing or unregistered component. That vertex is reported as linked to an inexistant mesh vertex.
    • The validity check treats such a vertex as invalid.
    • Other exceptions are no longer swallowed.
    • Such links cannot be built through the public API, only read from corrupted files, so this has no dedicated test.
  • Lines embedded in a Block: the invalid embedding messages called brep.surface() on a Block, which threw. The issues were lost; they are now reported with the right component type.
  • Model boundaries without surfaces: this case ran front()/pop() on an empty queue, which is undefined behavior.
  • Dangling surfaces detection: ambiguous ray tracing threw out of it and emptied the blocks result. A few polygons are now tried, and only active blocks are used.
  • Fusing block boundary shells: vertices without a unique vertex were all merged into a single point.
  • Expected number of block cmvs: an invalid topology could make it wrap around to about 4294967295. It is now computed as a signed value.

Performance (identical results on all test and benchmark models)

  • Surface polygons: for each polygon, only the Block facets around it are computed. Before, the line, surface and block polygons were all computed, the surface part going through polygons_around_vertex of every surface. Surface unique vertices and the surface/block relationships are now computed once per surface.
  • No formatted warning is logged per vertex from the parallel tasks.
  • The surfaces inspector is no longer copied in a per vertex lambda.

inspect_brep_topology (best of 3):

model before after
fimiston (Geode-Conversion data) 0.47 s 0.15 s
cva/brep_from_topo (Geode-Explicit data) 0.39 s 0.30 s
corbi_tet_mesh (Geode-Background data) 0.25 s 0.18 s

Not done

  • Running the per unique vertex and per polygon loops in parallel: these loops use polygons_around_vertex, polyhedra_around_vertex and is_vertex_on_border, whose lazy caches race in the current OpenGeode. This should come after fix(Mesh): robustness fixes found while reviewing OpenGeode-Inspector OpenGeode#1354 is released.
  • Smaller hot spots: brep_blocks_are_meshed on rare branches, the edge 0 CME per line vertex, per vertex components_uuids allocations, the BFS of closed boundaries, and line_on_block_boundary_count. The lines, corners and blocks parts are now a small share of the time.
  • Inactive components filtering consistency, and inner shells touching the outer shell: these are behavior changes that need a decision.

🤖 Generated with Claude Code

BotellaA and others added 10 commits October 14, 2026 17:45
…sage

Unique vertices non-bijectively linked to a component mesh vertex were
reported as "linked to inexistant mesh vertex". Report the unique vertex
the mesh vertex is actually linked to instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
inspect_brep/section_topology caught any OpenGeodeException thrown by the
corners, lines, surfaces or blocks inspection and silently left that whole
result empty, so the model could be reported valid. A unique vertex linked
to a missing or unregistered component (which the per vertex checks look up
without has_*() guards, and unique_vertex() throws std::out_of_range for)
triggered it. Each per unique vertex check now skips such a vertex (it is
reported as linked to an inexistant mesh vertex), the validity check treats
it as invalid, and other exceptions are no longer swallowed.
Such links cannot be built through the public API (removing a component
cleans them), only from corrupted files, so this is not covered by a test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The invalid embedding messages called brep.surface() on the embedding even
when it was a Block, which threw while building the message: the issue was
lost (and, before the previous fix, the whole lines result). The message now
uses the embedding component type and name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…aces

closed_linked_surfaces called front()/pop() on an empty queue when the model
boundaries had no items (undefined behavior). An empty list is now handled
and empty model boundaries have nothing to check. The new test documents
the expected result; without the fix the undefined behavior does not crash
here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ction

BRepRayTracing::is_point_inside_block throws on ambiguous rays; the
exception escaped find_dangling_surfaces and emptied the whole blocks
topology result. A few polygons of the surface are now tried, a surface
which cannot be located is not reported as dangling, and only active blocks
are considered. No deterministic ambiguous configuration is available for a
test; results on all test models are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ndaries

fuse_brep_surfaces_from_list merged vertices by unique vertex: every vertex
without unique vertex (NO_ID) was fused into a single point, which broke the
enclosing surface used to check block boundaries closure. Unlinked vertices
now keep their own point. Not covered by a dedicated test: it requires a
block with several boundary shells and unlinked boundary vertices.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The predicted number of block component mesh vertices was computed with
unsigned arithmetic: an invalid topology giving a negative prediction was
reported as expecting about 4294967295 block cmvs. It is now computed signed.
Results on all test models are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…non-manifold

expected_block_cmvs_and_error logged a formatted warning (point to string)
for every unique vertex on one side of a topological non-manifold, from the
parallel inspection tasks and again during validity checks. The inspection
result already reports the vertices whose count is wrong.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mbda

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
For each polygon of each surface, component_mesh_polygons computed the
line, surface and block polygons around it (the surface part going through
polygons_around_vertex of every surface sharing the vertices), plus one
unique_vertex lookup per polygon vertex, while only the block facets are
checked. Only the block facets are now computed, surface unique vertices are
fetched once, and the surface/block relationships (is_active, is_boundary,
is_internal) are computed once per surface instead of once per polygon.

inspect_brep_topology: fimiston 0.46s -> 0.15s, cva/brep_from_topo 0.37s ->
0.30s, corbi_tet_mesh 0.25s -> 0.18s (identical results).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@BotellaA
BotellaA requested a review from panquez October 14, 2026 17:32
@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Cpp-Linter Report ⚠️

Some files did not pass the configured checks!

clang-tidy (v21.1.8) reports: 70 concern(s)
  • include/geode/inspector/inspection/topology/internal/topology_helpers.hpp:44:1: warning: [modernize-concat-nested-namespaces]

    nested namespaces can be concatenated

       44 | namespace geode
          | ^~~~~~~~~~~~~~~
       45 | {
          | ~
       46 |     namespace internal
          |     ~~~~~~~~~~~~~~~~~~
          |     namespace geode::internal
  • include/geode/inspector/inspection/topology/internal/topology_helpers.hpp:99:37: error: [clang-diagnostic-error]

    variable has incomplete type 'ComponentMeshVertex'

       99 |                 ComponentMeshVertex component_mesh_vertex{ component_id,
          |                                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/include/geode/inspector/inspection/topology/internal/topology_helpers.hpp:39:12: note: forward declaration of 'geode::ComponentMeshVertex'
       39 |     struct ComponentMeshVertex;
          |            ^
  • include/geode/inspector/inspection/topology/internal/topology_helpers.hpp:128:13: warning: [bugprone-empty-catch]

    empty catch statements hide issues; to handle exceptions appropriately, consider re-throwing, handling, or avoiding catch altogether

      128 |             catch( const std::exception& )
          |             ^
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:119:10: warning: [readability-function-cognitive-complexity]

    function 'create_graph' has cognitive complexity of 16 (threshold 10)

      119 |     void create_graph( const geode::BRep& brep,
          |          ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:127:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      127 |         for( const auto& line : brep.lines() )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:132:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      132 |         for( const auto& line : brep.lines() )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:136:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      136 |             for( const auto& incident_surface : brep.incidences( line ) )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:138:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      138 |                 for( const auto& boundary_line :
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:144:21: note: +4, including nesting penalty of 3, nesting level increased to 4
      144 |                     if( const auto existing_edge = graph.edge_from_vertices(
          |                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:147:25: note: +5, including nesting penalty of 4, nesting level increased to 5
      147 |                         if( surface_uuids_to_graph_edges
          |                         ^
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:119:10: warning: [readability-function-size]

    function 'create_graph' exceeds recommended size/complexity thresholds

      119 |     void create_graph( const geode::BRep& brep,
          |          ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:119:10: note: 5 parameters (threshold 4)
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:163:32: warning: [readability-function-cognitive-complexity]

    function 'find_not_boundary_surfaces' has cognitive complexity of 33 (threshold 10)

      163 |     std::vector< geode::uuid > find_not_boundary_surfaces(
          |                                ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:176:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      176 |         while( found_not_boundary_surface )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:179:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      179 |             for( const auto graph_vertex :
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:182:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      182 |                 if( graph->edges_around_vertex( graph_vertex ).empty() )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:193:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      193 |                 for( const auto& edge_around :
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:196:21: note: +4, including nesting penalty of 3, nesting level increased to 4
      196 |                     if( surface_uuids_to_graph_edges
          |                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:205:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      205 |                 if( !should_delete )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:209:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      209 |                 if( absl::c_contains( not_boundaries_surfaces, surface_id ) )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:213:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      213 |                 for( const auto& edge :
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:220:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      220 |             if( !absl::c_contains( to_delete, true ) )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:228:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      228 |             for( const auto& [surface_id, graph_edges] :
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:231:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      231 |                 for( const auto graph_edge : graph_edges )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:233:21: note: +4, including nesting penalty of 3, nesting level increased to 4
      233 |                     if( old2new.at( graph_edge ) != geode::NO_ID )
          |                     ^
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:246:32: warning: [readability-function-cognitive-complexity]

    function 'find_dangling_surfaces' has cognitive complexity of 17 (threshold 10)

      246 |     std::vector< geode::uuid > find_dangling_surfaces( const geode::BRep& brep,
          |                                ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:251:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      251 |         for( const auto& surface_id : not_boundary_surfaces )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:254:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      254 |             if( surface_mesh.nb_polygons() == 0 )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:262:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      262 |             for( const auto polygon_id : geode::Range{
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:270:21: note: +3, including nesting penalty of 2, nesting level increased to 3
      270 |                     for( const auto& block : brep.active_blocks() )
          |                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:272:25: note: +4, including nesting penalty of 3, nesting level increased to 4
      272 |                         if( ray_tracing.is_point_inside_block(
          |                         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:281:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      281 |                 catch( const geode::OpenGeodeException& )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:286:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      286 |             if( is_dangling.value_or( false ) )
          |             ^
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:394:13: warning: [performance-inefficient-vector-operation]

    'emplace_back' is called inside a loop; consider pre-allocating the container capacity before the loop

      392 |         for( const auto& surface_list : linked_surfaces_list )
      393 |         {
      394 |             bounding_boxes.emplace_back(
          |             ^
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:420:50: warning: [readability-function-cognitive-complexity]

    function 'fuse_brep_surfaces_from_list' has cognitive complexity of 15 (threshold 10)

      420 |     std::unique_ptr< geode::PolygonalSurface3D > fuse_brep_surfaces_from_list(
          |                                                  ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:429:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      429 |         for( const auto& surface_id : surface_list )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:433:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      433 |             for( const auto polygon :
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:438:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      438 |                 for( auto& polygon_vertex : polygon_vertices )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:442:21: note: +4, including nesting penalty of 3, nesting level increased to 4
      442 |                     if( unique_vertex == geode::NO_ID )
          |                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:450:21: note: +4, including nesting penalty of 3, nesting level increased to 4
      450 |                     if( !unique_vertices_to_polygonal_surface_vertices
          |                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:460:21: note: +1, nesting level increased to 4
      460 |                     else
          |                     ^
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:474:10: warning: [readability-function-cognitive-complexity]

    function 'block_boundaries_are_closed' has cognitive complexity of 19 (threshold 10)

      474 |     bool block_boundaries_are_closed(
          |          ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:479:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      479 |         while( !to_process.empty() )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:484:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      484 |         if( linked_boundary_parts.size() < 2 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:490:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      490 |         if( !enclosing_surface_index )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:498:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      498 |         for( const auto surface_list_id :
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:501:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      501 |             if( surface_list_id == enclosing_surface_index.value() )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:505:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      505 |             for( const auto& surface_id :
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:509:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      509 |                 for( const auto vertex_id :
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:514:25: note: +4, including nesting penalty of 3, nesting level increased to 4
      514 |                         if( !geode::is_point_inside_closed_surface(
          |                         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:522:21: note: +4, including nesting penalty of 3, nesting level increased to 4
      522 |                     catch( const geode::OpenGeodeException& )
          |                     ^
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:565:53: warning: [readability-function-cognitive-complexity]

    function 'string' has cognitive complexity of 11 (threshold 10)

      565 |     std::string BRepBlocksTopologyInspectionResult::string() const
          |                                                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:568:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      568 |         if( some_blocks_not_meshed.nb_issues() != 0 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:572:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      572 |         if( wrong_block_boundary_surface.nb_issues() != 0 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:576:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      576 |         if( blocks_not_linked_to_a_unique_vertex.nb_issues() != 0 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:581:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      581 |         if( blocks_with_not_closed_boundary_surfaces.nb_issues() != 0 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:586:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      586 |         if( model_boundaries_dont_form_a_closed_surface.nb_issues() != 0 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:591:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      591 |         if( unique_vertices_part_of_two_blocks_and_no_boundary_surface
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:600:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      600 |         if( unique_vertices_with_incorrect_block_cmvs_count.nb_issues() != 0 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:606:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      606 |         if( unique_vertices_linked_to_surface_with_wrong_relationship_to_blocks
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:615:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      615 |         if( unique_vertices_linked_to_a_single_and_invalid_surface.nb_issues()
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:622:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      622 |         if( unique_vertex_linked_to_multiple_invalid_surfaces.nb_issues() != 0 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:628:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      628 |         if( !message.empty() )
          |         ^
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:668:9: warning: [readability-function-cognitive-complexity]

    function 'unique_vertex_is_part_of_two_blocks_and_no_boundary_surface' has cognitive complexity of 20 (threshold 10)

      668 |         unique_vertex_is_part_of_two_blocks_and_no_boundary_surface(
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:673:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      673 |         if( block_uuids.size() != 2 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:677:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      677 |         for( const auto& block_uuid : block_uuids )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:679:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      679 |             if( !brep_.block( block_uuid ).is_active() )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:684:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      684 |         for( const auto& surface_cmv :
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:687:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      687 |             if( surface_cmv.component_id.type
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:692:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      692 |             if( brep_.Relationships::is_boundary(
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:694:17: note: +1
      694 |                 && brep_.Relationships::is_boundary(
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:699:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      699 |             for( const auto& line_cmv :
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:702:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      702 |                 if( line_cmv.component_id.type
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:707:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      707 |                 if( brep_.Relationships::is_boundary(
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:709:21: note: +1
      709 |                     && ( brep_.Relationships::is_boundary(
          |                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:711:26: note: +1
      711 |                          || brep_.Relationships::is_boundary(
          |                          ^
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:748:9: warning: [readability-function-cognitive-complexity]

    function 'vertex_is_part_of_surface_with_wrong_relationships_to_block' has cognitive complexity of 13 (threshold 10)

      748 |         vertex_is_part_of_surface_with_wrong_relationships_to_block(
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:753:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      753 |         for( const auto& cmv :
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:756:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      756 |             if( cmv.component_id.type != Surface3D::component_type_static()
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:757:17: note: +1
      757 |                 || !brep_.surface( cmv.component_id.id ).is_active() )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:761:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      761 |             if( brep_.nb_incidences( cmv.component_id.id ) >= 1
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:762:17: note: +1
      762 |                 && absl::c_contains(
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:773:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      773 |             if( brep_.nb_embeddings( cmv.component_id.id ) >= 1
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:777:17: note: +1
      777 |                 && absl::c_contains( dangling_surface, cmv.component_id.id ) )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:787:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      787 |             if( brep_.nb_incidences( cmv.component_id.id ) < 1
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:789:17: note: +1
      789 |                 && !absl::c_contains( dangling_surface, cmv.component_id.id ) )
          |                 ^
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:805:29: warning: [readability-function-cognitive-complexity]

    function 'vertex_is_part_of_invalid_single_surface' has cognitive complexity of 17 (threshold 10)

      805 |         BRepBlocksTopology::vertex_is_part_of_invalid_single_surface(
          |                             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:811:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      811 |         if( surface_uuids.size() != 1
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:812:13: note: +1
      812 |             || !brep_.surface( surface_uuids[0] ).is_active() )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:819:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      819 |         if( absl::c_contains( not_boundary_surfaces, surface_id ) )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:823:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      823 |         if( block_uuids.size() > 2 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:829:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      829 |         if( brep_.nb_embeddings( surface_id ) > 0 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:831:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      831 |             if( internal::brep_blocks_are_meshed( brep_ ) )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:833:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      833 |                 if( block_uuids.size() != 1 )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:839:22: note: +1, nesting level increased to 3
      839 |                 else if( !brep_.Relationships::is_internal(
          |                      ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:849:9: note: +1, nesting level increased to 1
      849 |         else
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:851:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      851 |             for( const auto& block_id : block_uuids )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:853:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      853 |                 if( !brep_.Relationships::is_boundary( surface_id, block_id ) )
          |                 ^
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:839:17: warning: [llvm-else-after-return]

    do not use 'else' after 'return'

      839 |                 else if( !brep_.Relationships::is_internal(
          |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      840 |                              surface_id, block_uuids[0] ) )
          |                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      841 |                 {
          |                 ~
      842 |                     return absl::StrCat( "unique vertex ", unique_vertex_index,
          |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      843 |                         " is part of only one Surface, which is "
          |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      844 |                         "embedded, and one Block, but the Surface is "
          |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      845 |                         "not internal to the Block." );
          |                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      846 |                 }
          |                 ~
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:874:29: warning: [readability-function-cognitive-complexity]

    function 'vertex_is_part_of_invalid_multiple_surfaces' has cognitive complexity of 17 (threshold 10)

      874 |         BRepBlocksTopology::vertex_is_part_of_invalid_multiple_surfaces(
          |                             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:879:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      879 |         if( line_uuids.size() < 2 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:885:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      885 |         if( surface_uuids.size() < 2 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:890:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      890 |         for( const auto& surface_uuid : surface_uuids )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:892:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      892 |             if( brep_.nb_incidences( surface_uuid ) < 1
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:893:17: note: +1
      893 |                 && brep_.nb_embeddings( surface_uuid ) < 1 )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:899:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      899 |         if( not_dangling_surfaces.size() < 2 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:903:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      903 |         for( const auto& line_id : line_uuids )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:906:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      906 |             for( const auto& surface_id : not_dangling_surfaces )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:908:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      908 |                 if( !brep_.Relationships::is_internal( line_id, surface_id )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:909:21: note: +1
      909 |                     && !brep_.Relationships::is_boundary(
          |                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:916:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      916 |             if( brep_.nb_embeddings( line_id ) < 1
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:919:17: note: +1
      919 |                 && line_has_relations_with_all_surfaces )
          |                 ^
  • src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:937:29: warning: [readability-function-cognitive-complexity]

    function 'inspect_blocks' has cognitive complexity of 26 (threshold 10)

      937 |         BRepBlocksTopology::inspect_blocks() const
          |                             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:940:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      940 |         if( brep_.nb_active_blocks() == 0 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:949:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      949 |         for( const auto& block : brep_.active_blocks() )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:951:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      951 |             if( !block_is_meshed( brep_.block( block.id() ) ) )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:958:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      958 |         if( !blocks_not_meshed.empty() && !meshed_blocks.empty() )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:958:40: note: +1
      958 |         if( !blocks_not_meshed.empty() && !meshed_blocks.empty() )
          |                                        ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:960:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      960 |             for( const auto& block_id : blocks_not_meshed )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:970:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      970 |         for( const auto& meshed_block_id : meshed_blocks )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:976:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      976 |             if( block_result.nb_issues() != 0 )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:987:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      987 |         if( brep_.nb_model_boundaries() != 0 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:989:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      989 |             if( !brep_boundaries_are_closed( brep_ ) )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:995:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      995 |         for( const auto unique_vertex_id : Range{ brep_.nb_unique_vertices() } )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:1000:35: note: nesting level increased to 2
     1000 |                 unique_vertex_id, [&] {
          |                                   ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:1006:35: note: nesting level increased to 2
     1006 |                 unique_vertex_id, [&] {
          |                                   ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:1012:35: note: nesting level increased to 2
     1012 |                 unique_vertex_id, [&] {
          |                                   ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:1019:35: note: nesting level increased to 2
     1019 |                 unique_vertex_id, [&] {
          |                                   ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:1026:35: note: nesting level increased to 2
     1026 |                 unique_vertex_id, [&] {
          |                                   ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:1031:9: note: +1, including nesting penalty of 0, nesting level increased to 1
     1031 |         for( const auto& block : brep_.active_blocks() )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:1033:13: note: +2, including nesting penalty of 1, nesting level increased to 2
     1033 |             if( !block_boundaries_are_closed( brep_, block ) )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:1043:13: note: +2, including nesting penalty of 1, nesting level increased to 2
     1043 |             for( const auto& surface : brep_.boundaries( block ) )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:1045:17: note: +3, including nesting penalty of 2, nesting level increased to 3
     1045 |                 if( !surface.is_active() )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_blocks_topology.cpp:1049:17: note: +3, including nesting penalty of 2, nesting level increased to 3
     1049 |                 if( surface_boundaries_are_not_linked_to_another_block_boundary(
          |                 ^
  • src/geode/inspector/inspection/topology/brep_corners_topology.cpp:102:31: warning: [readability-function-cognitive-complexity]

    function 'brep_corner_topology_is_valid' has cognitive complexity of 14 (threshold 10)

      102 |     bool BRepCornersTopology::brep_corner_topology_is_valid(
          |                               ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:106:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      106 |         for( const auto& cmv :
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:109:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      109 |             if( cmv.component_id.type != Corner3D::component_type_static()
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:110:17: note: +1
      110 |                 || !brep_.corner( cmv.component_id.id ).is_active() )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:114:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      114 |             if( corner_found )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:120:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      120 |             if( brep_.nb_embeddings( corner_uuid ) == 0 )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:122:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      122 |                 if( brep_.nb_incidences( corner_uuid ) == 0 )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:127:18: note: +1, nesting level increased to 2
      127 |             else if( brep_.nb_incidences( corner_uuid ) > 1 )
          |                  ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:132:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      132 |         if( corner_is_multiply_embedded( unique_vertex_index ) )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:136:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      136 |         if( corner_is_part_of_line_but_not_boundary( unique_vertex_index ) )
          |         ^
  • src/geode/inspector/inspection/topology/brep_corners_topology.cpp:180:30: warning: [readability-function-cognitive-complexity]

    function 'corner_is_multiply_embedded' has cognitive complexity of 12 (threshold 10)

      180 |         BRepCornersTopology::corner_is_multiply_embedded(
          |                              ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:183:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      183 |         for( const auto& cmv :
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:186:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      186 |             if( cmv.component_id.type == Corner3D::component_type_static()
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:188:17: note: +1
      188 |                 && brep_.nb_embeddings( cmv.component_id.id ) > 1 )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:190:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      190 |                 for( const auto& embedding :
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:193:21: note: +4, including nesting penalty of 3, nesting level increased to 4
      193 |                     if( embedding.type == Block3D::component_type_static()
          |                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:194:25: note: +1
      194 |                         && brep_.block( embedding.id ).is_active() )
          |                         ^
  • src/geode/inspector/inspection/topology/brep_corners_topology.cpp:236:30: warning: [readability-function-cognitive-complexity]

    function 'corner_is_part_of_line_but_not_boundary' has cognitive complexity of 27 (threshold 10)

      236 |         BRepCornersTopology::corner_is_part_of_line_but_not_boundary(
          |                              ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:239:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      239 |         for( const auto& cmv :
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:242:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      242 |             if( cmv.component_id.type != Corner3D::component_type_static()
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:243:17: note: +1
      243 |                 || !brep_.corner( cmv.component_id.id ).is_active() )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:249:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      249 |             for( const auto& cmv_line :
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:253:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      253 |                 if( cmv_line.component_id.type
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:255:21: note: +1
      255 |                     || !brep_.line( line_id ).is_active() )
          |                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:261:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      261 |             for( const auto& [line_id, nb_cmvs] : line_to_nb_cmvs )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:264:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      264 |                 if( brep_.is_boundary( corner, line ) )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:266:21: note: +4, including nesting penalty of 3, nesting level increased to 4
      266 |                     if( nb_cmvs != 1 && nb_cmvs != 2 )
          |                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:266:38: note: +1
      266 |                     if( nb_cmvs != 1 && nb_cmvs != 2 )
          |                                      ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:281:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      281 |                 if( brep_.is_internal( corner, line ) )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_corners_topology.cpp:283:21: note: +4, including nesting penalty of 3, nesting level increased to 4
      283 |                     if( nb_cmvs != 2 )
          |                     ^
  • src/geode/inspector/inspection/topology/brep_lines_topology.cpp:48:20: warning: [readability-identifier-length]

    variable name 'id' is too short, expected at least 3 characters

       48 |         const auto id = embedding.id.string();
          |                    ^
  • src/geode/inspector/inspection/topology/brep_lines_topology.cpp:176:28: warning: [readability-function-cognitive-complexity]

    function 'vertex_is_part_of_invalid_embedded_line' has cognitive complexity of 17 (threshold 10)

      176 |         BRepLinesTopology::vertex_is_part_of_invalid_embedded_line(
          |                            ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:179:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      179 |         for( const auto& line_cmv :
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:182:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      182 |             if( line_cmv.component_id.type != Line3D::component_type_static() )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:188:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      188 |             if( !line.is_active() )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:192:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      192 |             for( const auto& embedding : brep_.embeddings( line_id ) )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:194:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      194 |                 if( brep_.Relationships::is_boundary( line_id, embedding.id ) )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:203:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      203 |                 if( embedding.type == Block3D::component_type_static()
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:204:21: note: +1
      204 |                     && !internal::brep_blocks_are_meshed( brep_ ) )
          |                     ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:208:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      208 |                 if( !absl::c_any_of(
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:210:25: note: nesting level increased to 3
      210 |                         [&embedding]( const ComponentMeshVertex& cmv ) {
          |                         ^
  • src/geode/inspector/inspection/topology/brep_lines_topology.cpp:228:28: warning: [readability-function-cognitive-complexity]

    function 'vertex_is_part_of_invalid_single_line' has cognitive complexity of 23 (threshold 10)

      228 |         BRepLinesTopology::vertex_is_part_of_invalid_single_line(
          |                            ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:233:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      233 |         if( line_uuids.size() != 1 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:239:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      239 |         if( !line.is_active() )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:247:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      247 |         if( brep_.nb_embedding_surfaces( line ) < 1
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:248:13: note: +1
      248 |             && brep_.nb_incidences( line_id ) < 1 )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:252:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      252 |         if( surface_uuids.size() == 1 )
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:254:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      254 |             if( !brep_.Relationships::is_internal( line_id, surface_uuids[0] )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:255:17: note: +1
      255 |                 && !( brep_.Relationships::nb_embeddings( surface_uuids[0] ) > 0
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:256:23: note: +1
      256 |                       || brep_.Relationships::is_boundary(
          |                       ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:272:14: note: +1, nesting level increased to 1
      272 |         else if( surface_uuids.empty() )
          |              ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:274:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      274 |             if( !internal::brep_blocks_are_meshed( brep_ ) )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:278:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      278 |             if( block_uuids.size() != 1 )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:286:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      286 |             if( !brep_.Relationships::is_internal( line_id, block_uuids[0] ) )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:296:9: note: +1, nesting level increased to 1
      296 |         else
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:298:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      298 |             for( const auto& surface_id : surface_uuids )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:301:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      301 |                 if( !brep_.is_boundary( line, surface )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:302:21: note: +1
      302 |                     && !brep_.is_internal( line, surface ) )
          |                     ^
  • src/geode/inspector/inspection/topology/brep_lines_topology.cpp:255:20: warning: [readability-simplify-boolean-expr]

    boolean expression can be simplified by DeMorgan's theorem

      255 |                 && !( brep_.Relationships::nb_embeddings( surface_uuids[0] ) > 0
          |                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          |                                                                              <=
      256 |                       || brep_.Relationships::is_boundary(
          |                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          |                       && !
      257 |                           line_id, surface_uuids[0] ) ) )
          |                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • src/geode/inspector/inspection/topology/brep_lines_topology.cpp:319:9: warning: [readability-function-cognitive-complexity]

    function 'vertex_is_part_of_line_with_wrong_relationships_to_surface' has cognitive complexity of 38 (threshold 10)

      319 |         vertex_is_part_of_line_with_wrong_relationships_to_surface(
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:322:9: note: +1, including nesting penalty of 0, nesting level increased to 1
      322 |         for( const auto& cmv :
          |         ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:325:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      325 |             if( cmv.component_id.type != Line3D::component_type_static() )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:330:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      330 |             if( !line.is_active() || line.mesh().nb_edges() == 0 )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:330:35: note: +1
      330 |             if( !line.is_active() || line.mesh().nb_edges() == 0 )
          |                                   ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:335:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      335 |             for( const auto& incident_surface : brep_.incidences( line ) )
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:337:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      337 |                 if( !incident_surface.is_active() )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:341:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      341 |                 if( !cme.surface_edges.contains( incident_surface.id() ) )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:352:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      352 |                 if( cme.surface_edges.at( incident_surface.id() ).size() != 1 )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:366:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      366 |             for( const auto& embedding_surface :
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:369:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      369 |                 if( !embedding_surface.is_active() )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:373:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      373 |                 if( !cme.surface_edges.contains( embedding_surface.id() ) )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:385:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      385 |                 if( cme.surface_edges.at( embedding_surface.id() ).size() <= 1 )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:399:13: note: +2, including nesting penalty of 1, nesting level increased to 2
      399 |             if( brep_.nb_incidences( cmv.component_id.id ) == 0
          |             ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:400:17: note: +1
      400 |                 && brep_.nb_embedding_surfaces( line ) == 0 )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:402:17: note: +3, including nesting penalty of 2, nesting level increased to 3
      402 |                 for( const auto& [surface_id, _] : cme.surface_edges )
          |                 ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_lines_topology.cpp:404:21: note: +4, including nesting penalty of 3, nesting level increased to 4
      404 |                     if( brep_.surface( surface_id ).is_active() )
          |                     ^
  • src/geode/inspector/inspection/topology/brep_surfaces_topology.cpp:64:21: warning: [readability-identifier-length]

    variable name 'it' is too short, expected at least 3 characters

       64 |         const auto [it, inserted] =
          |                     ^
  • src/geode/inspector/inspection/topology/brep_surfaces_topology.cpp:84:34: warning: [readability-function-size]

    function 'polygon_has_wrong_component_facets_around' exceeds recommended size/complexity thresholds

       84 |     std::optional< std::string > polygon_has_wrong_component_facets_around(
          |                                  ^
    /__w/OpenGeode-Inspector/OpenGeode-Inspector/src/geode/inspector/inspection/topology/brep_surfaces_topology.cpp:84:34: note: 5 parameters (threshold 4)
  • src/geode/inspector/inspection/topology/brep_topology.cpp:70:9: warning: [google-explicit-constructor]

    single-argument constructors must be marked explicit to avoid unintentional implicit conversions

       70 |         Impl( const BRep& brep ) : brep_( brep ) {}
          |         ^
          |         explicit 

Have any feedback or feature suggestions? Share it here.

@panquez

panquez commented Oct 15, 2026

Copy link
Copy Markdown
Member

On the summary, I think there is indeed a deep analysis of active/inactive homogeneity in the ecosystem

brep_.unique_vertex( cmv );
linked_unique_vertex != uv_id )
{
linked_to_nonbijective_result.add_issue( uv_id,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest that a follow-up of this PR is to review and improve message for readability by users

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, message readability deserves its own pass: I'll keep it for a follow-up PR so this one stays focused on robustness/performance.

result
.unique_vertices_linked_to_surface_with_wrong_relationship_to_blocks
.add_issue( unique_vertex_id, problem_message.value() );
if( const auto problem_message =

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe putting each if-branch call into a dedicated try catch block will be much better to fill result with other non failing criteria

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in d024403: each check now runs in its own try/catch through a new internal::add_unique_vertex_issue helper (topology_helpers.hpp), so a throwing check no longer prevents the other checks from filling the result. Covered by test_checks_independent_of_failing_check (fails before, passes after).

result
.unique_vertices_linked_to_not_internal_nor_boundary_corner
.add_issue( unique_vertex_id, problem_message.value() );
if( const auto problem_message =

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same remark here, and check everywhere to homogeneize changes if applied

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in d024403, applied homogeneously to all per-unique-vertex loops: BRep corners/lines/surfaces/blocks and Section corners/lines/surfaces.

{
return brep_.unique_vertex( cmv );
}
catch( const std::out_of_range& )

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

only this exception, or catch all kind of exceptions ? What happens if we change the throwable exception types without changing this code

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point: it now catches std::exception (d024403, BRep and Section), so changing the thrown type upstream won't break it.

/// On one side of a topological non-manifold => 2 cases possible,
/// depending on wether the topological non-manifold is on the
/// interior or exterior of the block
geode::Logger::warning( absl::StrCat(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not agree to remove this comment. The formulae found and implemented is shown to not work in certain non manifold block vertex configurations. Do not remove it. Or solve the expected number of block cmvs formulae, which I assume is quite complicated

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right, restored in a98d601: the warning is back on the topological non-manifold case where the formula is unsure.

BotellaA and others added 2 commits October 15, 2026 19:11
A check throwing on a wrong link to a component no longer prevents the
following checks on the same unique vertex from filling the result.
Catch std::exception when looking up the unique vertex of a component
mesh vertex, so it does not depend on the exact exception type.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… count

The expected number of block cmvs formula is known to fail in some non
manifold configurations, keep warning the user about it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@BotellaA
BotellaA merged commit 0476fea into next Oct 15, 2026
24 checks passed
@BotellaA
BotellaA deleted the fix/topology-review branch October 15, 2026 17:27
@BotellaA

Copy link
Copy Markdown
Member Author

🎉 This PR is included in version 6.12.4-rc.1 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants