From b814592e65e4fa20bf33eb162192db85a99eb902 Mon Sep 17 00:00:00 2001 From: BenPinet Date: Wed, 12 Aug 2026 09:28:21 +0200 Subject: [PATCH] feat(ModelBuilders): model builder changes --- .../geode/io/model/internal/msh_common.hpp | 58 +++++++++---------- src/geode/io/model/msh_input.cpp | 16 +++-- src/geode/io/model/svg_input.cpp | 5 +- 3 files changed, 39 insertions(+), 40 deletions(-) diff --git a/include/geode/io/model/internal/msh_common.hpp b/include/geode/io/model/internal/msh_common.hpp index 44e9f535..0ccd6ac5 100644 --- a/include/geode/io/model/internal/msh_common.hpp +++ b/include/geode/io/model/internal/msh_common.hpp @@ -229,7 +229,8 @@ namespace geode } const auto v_id = - builder.corner_mesh_builder( corner_uuid )->create_vertex(); + builder.corner_mesh_builder( brep.corner( corner_uuid ) ) + ->create_vertex(); builder.set_unique_vertex( { brep.corner( corner_uuid ).component_id(), v_id }, vertex_ids()[0] - GMSH_OFFSET_START ); @@ -265,14 +266,13 @@ namespace geode line_uuid = builder.add_line(); id_map.elementary_ids.insert( { cur_gmsh_id, line_uuid } ); } + const auto& line = brep.line( line_uuid ); const auto first_v_id = - builder.line_mesh_builder( line_uuid ) - ->create_vertices( vertex_ids().size() ); + builder.line_mesh_builder( line )->create_vertices( + vertex_ids().size() ); const auto edge_id = - builder.line_mesh_builder( line_uuid ) - ->create_edge( first_v_id, first_v_id + 1 ); - - const auto& line = brep.line( line_uuid ); + builder.line_mesh_builder( line )->create_edge( + first_v_id, first_v_id + 1 ); for( const auto v_id : geode::LIndices{ vertex_ids() } ) { builder.set_unique_vertex( @@ -314,16 +314,16 @@ namespace geode id_map.elementary_ids.insert( { cur_gmsh_id, surface_uuid } ); } + const auto& surface = brep.surface( surface_uuid ); const auto first_v_id = - builder.surface_mesh_builder( surface_uuid ) - ->create_vertices( vertex_ids().size() ); + builder.surface_mesh_builder( surface )->create_vertices( + vertex_ids().size() ); std::vector< geode::index_t > v_ids( vertex_ids().size() ); std::iota( v_ids.begin(), v_ids.end(), first_v_id ); const auto polygon_id = - builder.surface_mesh_builder( surface_uuid ) - ->create_polygon( v_ids ); + builder.surface_mesh_builder( surface )->create_polygon( + v_ids ); - const auto& surface = brep.surface( surface_uuid ); for( const auto v_id : geode::LIndices{ vertex_ids() } ) { builder.set_unique_vertex( @@ -372,7 +372,7 @@ namespace geode virtual geode::index_t create_gmsh_polyhedron( geode::BRepBuilder& builder, - const uuid& block_uuid, + const Block3D& block, const std::vector< geode::index_t >& v_ids ) = 0; void add_element( geode::BRep& brep, GmshId2Uuids& id_map ) final @@ -395,16 +395,16 @@ namespace geode geode::HybridSolid3D::type_name_static() ) ); id_map.elementary_ids.insert( { cur_gmsh_id, block_uuid } ); } + const auto& block = brep.block( block_uuid ); const auto first_v_id = - builder.block_mesh_builder( block_uuid ) - ->create_vertices( vertex_ids().size() ); + builder.block_mesh_builder( block )->create_vertices( + vertex_ids().size() ); std::vector< geode::index_t > v_ids( vertex_ids().size() ); std::iota( v_ids.begin(), v_ids.end(), first_v_id ); const auto polyhedron_id = - create_gmsh_polyhedron( builder, block_uuid, v_ids ); + create_gmsh_polyhedron( builder, block, v_ids ); - const auto& block = brep.block( block_uuid ); for( const auto v_id : geode::LIndices{ vertex_ids() } ) { builder.set_unique_vertex( @@ -427,15 +427,15 @@ namespace geode } geode::index_t create_gmsh_polyhedron( geode::BRepBuilder& builder, - const uuid& block_uuid, + const Block3D& block, const std::vector< geode::index_t >& v_ids ) override final { static const std::array< std::vector< geode::local_index_t >, 4 > gmsh_tetrahedron_faces{ { { 0, 1, 2 }, { 0, 2, 3 }, { 1, 3, 2 }, { 0, 3, 1 } } }; - return builder.block_mesh_builder( block_uuid ) - ->create_polyhedron( v_ids, gmsh_tetrahedron_faces ); + return builder.block_mesh_builder( block )->create_polyhedron( + v_ids, gmsh_tetrahedron_faces ); } }; @@ -451,7 +451,7 @@ namespace geode } geode::index_t create_gmsh_polyhedron( geode::BRepBuilder& builder, - const uuid& block_uuid, + const Block3D& block, const std::vector< geode::index_t >& v_ids ) override final { static const std::array< std::vector< geode::local_index_t >, @@ -459,8 +459,8 @@ namespace geode gmsh_hexahedron_faces{ { { 0, 1, 2, 3 }, { 7, 6, 5, 4 }, { 0, 3, 7, 4 }, { 1, 5, 6, 2 }, { 2, 6, 7, 3 }, { 0, 4, 5, 1 } } }; - return builder.block_mesh_builder( block_uuid ) - ->create_polyhedron( v_ids, gmsh_hexahedron_faces ); + return builder.block_mesh_builder( block )->create_polyhedron( + v_ids, gmsh_hexahedron_faces ); } }; @@ -476,15 +476,15 @@ namespace geode } geode::index_t create_gmsh_polyhedron( geode::BRepBuilder& builder, - const uuid& block_uuid, + const Block3D& block, const std::vector< geode::index_t >& v_ids ) override final { static const std::array< std::vector< geode::local_index_t >, 5 > gmsh_prism_faces{ { { 0, 1, 2 }, { 5, 4, 3 }, { 0, 2, 5, 3 }, { 0, 3, 4, 1 }, { 1, 4, 5, 2 } } }; - return builder.block_mesh_builder( block_uuid ) - ->create_polyhedron( v_ids, gmsh_prism_faces ); + return builder.block_mesh_builder( block )->create_polyhedron( + v_ids, gmsh_prism_faces ); } }; @@ -500,15 +500,15 @@ namespace geode } geode::index_t create_gmsh_polyhedron( geode::BRepBuilder& builder, - const uuid& block_uuid, + const Block3D& block, const std::vector< geode::index_t >& v_ids ) override final { static const std::array< std::vector< geode::local_index_t >, 5 > gmsh_pyramid_faces{ { { 0, 3, 4 }, { 0, 4, 1 }, { 4, 3, 2 }, { 1, 4, 2 }, { 0, 1, 2, 3 } } }; - return builder.block_mesh_builder( block_uuid ) - ->create_polyhedron( v_ids, gmsh_pyramid_faces ); + return builder.block_mesh_builder( block )->create_polyhedron( + v_ids, gmsh_pyramid_faces ); } }; diff --git a/src/geode/io/model/msh_input.cpp b/src/geode/io/model/msh_input.cpp index 0e470009..fc8a1622 100644 --- a/src/geode/io/model/msh_input.cpp +++ b/src/geode/io/model/msh_input.cpp @@ -603,7 +603,7 @@ namespace { for( const auto& c : brep_.corners() ) { - builder_.corner_mesh_builder( c.id() )->set_point( + builder_.corner_mesh_builder( c )->set_point( 0, nodes_[brep_.unique_vertex( { c.component_id(), 0 } )] ); } } @@ -613,7 +613,7 @@ namespace for( const auto& l : brep_.lines() ) { filter_duplicated_line_vertices( l, brep_ ); - auto line_builder = builder_.line_mesh_builder( l.id() ); + auto line_builder = builder_.line_mesh_builder( l ); for( const auto v : geode::Range{ l.mesh().nb_vertices() } ) { line_builder->set_point( @@ -628,8 +628,7 @@ namespace for( const auto& surface : brep_.surfaces() ) { filter_duplicated_surface_vertices( surface, brep_ ); - auto surface_builder = - builder_.surface_mesh_builder( surface.id() ); + auto surface_builder = builder_.surface_mesh_builder( surface ); const auto& mesh = surface.mesh(); for( const auto v : geode::Range{ mesh.nb_vertices() } ) { @@ -692,7 +691,7 @@ namespace for( const auto& b : brep_.blocks() ) { filter_duplicated_block_vertices( b, brep_ ); - auto block_builder = builder_.block_mesh_builder( b.id() ); + auto block_builder = builder_.block_mesh_builder( b ); for( const auto v : geode::Range{ b.mesh().nb_vertices() } ) { block_builder->set_point( @@ -780,8 +779,7 @@ namespace void filter_duplicated_line_vertices( const geode::Line3D& line, geode::BRep& brep ) { - auto builder = - geode::BRepBuilder{ brep }.line_mesh_builder( line.id() ); + auto builder = geode::BRepBuilder{ brep }.line_mesh_builder( line ); filter_duplicated_vertices( line, brep, *builder ); } @@ -789,7 +787,7 @@ namespace const geode::Surface3D& surface, geode::BRep& brep ) { auto builder = - geode::BRepBuilder{ brep }.surface_mesh_builder( surface.id() ); + geode::BRepBuilder{ brep }.surface_mesh_builder( surface ); filter_duplicated_vertices( surface, brep, *builder ); } @@ -797,7 +795,7 @@ namespace const geode::Block3D& block, geode::BRep& brep ) { auto builder = - geode::BRepBuilder{ brep }.block_mesh_builder( block.id() ); + geode::BRepBuilder{ brep }.block_mesh_builder( block ); filter_duplicated_vertices( block, brep, *builder ); } diff --git a/src/geode/io/model/svg_input.cpp b/src/geode/io/model/svg_input.cpp index b0b34bdf..5021060b 100644 --- a/src/geode/io/model/svg_input.cpp +++ b/src/geode/io/model/svg_input.cpp @@ -357,7 +357,8 @@ namespace return; } const auto& line_id = builder_.add_line(); - const auto line_builder = builder_.line_mesh_builder( line_id ); + const auto line_builder = + builder_.line_mesh_builder( section_.line( line_id ) ); line_builder->create_point( vertices.front() ); for( const auto v : geode::Range{ 1, vertices.size() } ) { @@ -377,7 +378,7 @@ namespace for( const auto& unique_point : colocated_info.unique_points ) { const auto corner_id = builder_.add_corner(); - builder_.corner_mesh_builder( corner_id ) + builder_.corner_mesh_builder( section_.corner( corner_id ) ) ->create_point( unique_point ); const auto uv_id = builder_.create_unique_vertex(); builder_.set_unique_vertex(