Skip to content

Commit fa33bc0

Browse files
Merge pull request #1146 from Geode-solutions/fix/n-lith
fix(Model): add API functions to get component_mesh_edges specifying …
2 parents 9717261 + 64e2776 commit fa33bc0

File tree

4 files changed

+236
-3
lines changed

4 files changed

+236
-3
lines changed

include/geode/model/helpers/component_mesh_edges.hpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,30 @@ namespace geode
129129
line_component_mesh_edges( const Model& model,
130130
const std::array< index_t, 2 >& edge_unique_vertices );
131131

132+
template < typename Model >
133+
[[nodiscard]] std::vector< index_t > line_component_mesh_edges(
134+
const Model& model,
135+
const std::array< index_t, 2 >& edge_unique_vertices,
136+
const geode::Line< Model::dim >& line );
137+
132138
template < typename Model >
133139
[[nodiscard]] ModelComponentMeshEdges::SurfaceEdges
134140
surface_component_mesh_edges( const Model& model,
135141
const std::array< index_t, 2 >& edge_unique_vertices );
136142

143+
template < typename Model >
144+
[[nodiscard]] std::vector< PolygonEdge > surface_component_mesh_edges(
145+
const Model& model,
146+
const std::array< index_t, 2 >& edge_unique_vertices,
147+
const geode::Surface< Model::dim >& surface );
148+
137149
[[nodiscard]] BRepComponentMeshEdges::BlockEdges opengeode_model_api
138150
block_component_mesh_edges( const BRep& brep,
139151
const std::array< index_t, 2 >& edge_unique_vertices );
152+
153+
[[nodiscard]] std::vector< PolyhedronFacetEdge >
154+
opengeode_model_api block_component_mesh_edges( const BRep& brep,
155+
const std::array< index_t, 2 >& edge_unique_vertices,
156+
const Block3D& block );
140157
} // namespace detail
141158
} // namespace geode

include/geode/model/helpers/component_mesh_vertices.hpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ namespace geode
5656
absl::Span< const absl::Span< const ComponentMeshVertex > >
5757
unique_vertices,
5858
const ComponentType& type );
59+
template < index_t dimension >
60+
[[nodiscard]] ComponentMeshVertexGeneric< dimension >
61+
component_mesh_vertex_generic(
62+
absl::Span< const absl::Span< const ComponentMeshVertex > >
63+
unique_vertices,
64+
const ComponentID& component );
5965

6066
using ComponentMeshVertexPairs = ComponentMeshVertexGeneric< 2 >;
6167
[[nodiscard]] ComponentMeshVertexPairs opengeode_model_api
@@ -67,6 +73,11 @@ namespace geode
6773
absl::Span< const ComponentMeshVertex > unique_vertices0,
6874
absl::Span< const ComponentMeshVertex > unique_vertices1,
6975
const ComponentType& type );
76+
[[nodiscard]] ComponentMeshVertexPairs opengeode_model_api
77+
component_mesh_vertex_pairs(
78+
absl::Span< const ComponentMeshVertex > unique_vertices0,
79+
absl::Span< const ComponentMeshVertex > unique_vertices1,
80+
const ComponentID& component );
7081

7182
using ComponentMeshVertexTriplets = ComponentMeshVertexGeneric< 3 >;
7283
[[nodiscard]] ComponentMeshVertexTriplets opengeode_model_api
@@ -80,6 +91,12 @@ namespace geode
8091
absl::Span< const ComponentMeshVertex > unique_vertices1,
8192
absl::Span< const ComponentMeshVertex > unique_vertices2,
8293
const ComponentType& type );
94+
[[nodiscard]] ComponentMeshVertexTriplets opengeode_model_api
95+
component_mesh_vertex_triplets(
96+
absl::Span< const ComponentMeshVertex > unique_vertices0,
97+
absl::Span< const ComponentMeshVertex > unique_vertices1,
98+
absl::Span< const ComponentMeshVertex > unique_vertices2,
99+
const ComponentID& component );
83100

84101
template < index_t dimension, typename... UniqueVertices >
85102
[[nodiscard]] ComponentMeshVertexGeneric< dimension >
@@ -99,4 +116,14 @@ namespace geode
99116
unique_vertices... ),
100117
type );
101118
}
119+
template < index_t dimension, typename... UniqueVertices >
120+
[[nodiscard]] ComponentMeshVertexGeneric< dimension >
121+
component_mesh_vertex_tuple(
122+
UniqueVertices... unique_vertices, const ComponentID& component )
123+
{
124+
return component_mesh_vertex_generic(
125+
to_array< absl::Span< const ComponentMeshVertex > >(
126+
unique_vertices... ),
127+
component );
128+
}
102129
} // namespace geode

src/geode/model/helpers/component_mesh_edges.cpp

Lines changed: 133 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/geode/model/helpers/component_mesh_vertices.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,21 @@ namespace geode
120120
} );
121121
}
122122

123+
ComponentMeshVertexPairs component_mesh_vertex_pairs(
124+
absl::Span< const ComponentMeshVertex > unique_vertices0,
125+
absl::Span< const ComponentMeshVertex > unique_vertices1,
126+
const ComponentID& component )
127+
{
128+
return ::component_mesh_vertex_generic< 2 >(
129+
to_array< absl::Span< const ComponentMeshVertex > >(
130+
unique_vertices0, unique_vertices1 ),
131+
[&component]( const ComponentMeshVertex& cmv0,
132+
const ComponentMeshVertex& cmv1 ) {
133+
return cmv0.component_id == component
134+
&& cmv0.component_id == cmv1.component_id;
135+
} );
136+
}
137+
123138
ComponentMeshVertexTriplets component_mesh_vertex_triplets(
124139
absl::Span< const ComponentMeshVertex > unique_vertices0,
125140
absl::Span< const ComponentMeshVertex > unique_vertices1,
@@ -150,6 +165,22 @@ namespace geode
150165
} );
151166
}
152167

168+
ComponentMeshVertexTriplets component_mesh_vertex_triplets(
169+
absl::Span< const ComponentMeshVertex > unique_vertices0,
170+
absl::Span< const ComponentMeshVertex > unique_vertices1,
171+
absl::Span< const ComponentMeshVertex > unique_vertices2,
172+
const ComponentID& component )
173+
{
174+
return ::component_mesh_vertex_generic< 3 >(
175+
to_array< absl::Span< const ComponentMeshVertex > >(
176+
unique_vertices0, unique_vertices1, unique_vertices2 ),
177+
[&component]( const ComponentMeshVertex& cmv0,
178+
const ComponentMeshVertex& cmv1 ) {
179+
return cmv0.component_id == component
180+
&& cmv0.component_id == cmv1.component_id;
181+
} );
182+
}
183+
153184
template < geode::index_t dimension >
154185
geode::ComponentMeshVertexGeneric< dimension >
155186
component_mesh_vertex_generic(
@@ -178,6 +209,21 @@ namespace geode
178209
} );
179210
}
180211

212+
template < geode::index_t dimension >
213+
geode::ComponentMeshVertexGeneric< dimension >
214+
component_mesh_vertex_generic(
215+
absl::Span< const absl::Span< const geode::ComponentMeshVertex > >
216+
unique_vertices,
217+
const ComponentID& component )
218+
{
219+
return ::component_mesh_vertex_generic< dimension >(
220+
unique_vertices, [&component]( const ComponentMeshVertex& cmv0,
221+
const ComponentMeshVertex& cmv1 ) {
222+
return cmv0.component_id == component
223+
&& cmv0.component_id == cmv1.component_id;
224+
} );
225+
}
226+
181227
template ComponentMeshVertexGeneric< 2 >
182228
opengeode_model_api component_mesh_vertex_generic< 2 >(
183229
absl::Span< const absl::Span< const ComponentMeshVertex > > );
@@ -200,4 +246,17 @@ namespace geode
200246
opengeode_model_api component_mesh_vertex_generic< 4 >(
201247
absl::Span< const absl::Span< const ComponentMeshVertex > >,
202248
const ComponentType& );
249+
250+
template ComponentMeshVertexGeneric< 2 >
251+
opengeode_model_api component_mesh_vertex_generic< 2 >(
252+
absl::Span< const absl::Span< const ComponentMeshVertex > >,
253+
const ComponentID& );
254+
template ComponentMeshVertexGeneric< 3 >
255+
opengeode_model_api component_mesh_vertex_generic< 3 >(
256+
absl::Span< const absl::Span< const ComponentMeshVertex > >,
257+
const ComponentID& );
258+
template ComponentMeshVertexGeneric< 4 >
259+
opengeode_model_api component_mesh_vertex_generic< 4 >(
260+
absl::Span< const absl::Span< const ComponentMeshVertex > >,
261+
const ComponentID& );
203262
} // namespace geode

0 commit comments

Comments
 (0)