Completes the work begun in the previous commit on this branch. Every
public symbol under code/include/ now carries a brief Doxygen comment
(0 undocumented per scripts/doxygen-coverage.sh, with the `detail::`
implementation namespaces excluded as before).
Trajectory on this branch:
start (after Doxyfile fix): 24.0 % (165 / 437 in the no-detail set
was 105 / 437 when detail counted)
after PR #17 base commit : 42.4 % (165 / 396)
this commit : 100.0 % (396 / 396)
Files touched (all .hpp / .h headers under code/include/):
* cgal/Conformal_map_traits.h
* clausen.hpp, conformal_mesh.hpp, constants.hpp (already docd)
* cp_euclidean_functional.hpp, cut_graph.hpp, discrete_elliptic_utility.hpp
* euclidean_functional.hpp, euclidean_geometry.hpp, euclidean_hessian.hpp
* fundamental_domain.hpp, gauss_bonnet.hpp
* hyper_ideal_{functional,geometry,hessian,utility,visualization_utility}.hpp
* inversive_distance_functional.hpp, layout.hpp
* matrix_utility.hpp, mesh_builder.hpp, mesh_io.hpp
* newton_solver.hpp, p2_utility.hpp, period_matrix.hpp, projective_math.hpp
* serialization.hpp, spherical_functional.hpp, spherical_geometry.hpp
* spherical_hessian.hpp, viewer_utils.h
CI:
.gitea/workflows/doxygen-pages.yml now enforces
`scripts/doxygen-coverage.sh --threshold 100`, so any future regression
(a new public function landed without a `///` brief) fails the build
before the Doxygen HTML is published to Codeberg Pages.
Doxygen warnings remain at 0.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
64 lines
2.0 KiB
C++
64 lines
2.0 KiB
C++
#pragma once
|
|
// mesh_io.hpp
|
|
//
|
|
// Phase 4b — CGAL::IO wrappers for ConformalMesh.
|
|
//
|
|
// Reads and writes ConformalMesh (CGAL::Surface_mesh) in standard polygon-mesh
|
|
// formats using the CGAL Polygon Mesh I/O utilities (CGAL 5.4+).
|
|
//
|
|
// Supported formats (detected by file extension):
|
|
// .off — Object File Format (read + write)
|
|
// .obj — Wavefront OBJ (read + write)
|
|
// .ply — Polygon File Format (read + write)
|
|
//
|
|
// Usage:
|
|
// ConformalMesh mesh;
|
|
// if (!read_mesh("input.off", mesh)) throw std::runtime_error("read failed");
|
|
// // ... process mesh ...
|
|
// write_mesh("output.off", mesh);
|
|
//
|
|
// Note: property maps (lambda0, v_idx, etc.) are NOT serialised — they must
|
|
// be re-initialised with setup_*_maps() + compute_lambda0_from_mesh() after
|
|
// reading a file.
|
|
|
|
#include "conformal_mesh.hpp"
|
|
#include <CGAL/IO/polygon_mesh_io.h>
|
|
#include <string>
|
|
#include <stdexcept>
|
|
|
|
namespace conformallab {
|
|
|
|
/// Read a polygon mesh from `filename` into `mesh` (clears existing content).
|
|
/// Returns `true` on success, `false` on failure.
|
|
inline bool read_mesh(const std::string& filename, ConformalMesh& mesh)
|
|
{
|
|
mesh.clear();
|
|
return CGAL::IO::read_polygon_mesh(filename, mesh);
|
|
}
|
|
|
|
/// Write `mesh` to `filename`. Returns `true` on success.
|
|
inline bool write_mesh(const std::string& filename, const ConformalMesh& mesh)
|
|
{
|
|
return CGAL::IO::write_polygon_mesh(filename, mesh);
|
|
}
|
|
|
|
/// Throwing wrapper around `read_mesh`: returns the mesh by value
|
|
/// or throws `std::runtime_error` on read failure.
|
|
inline ConformalMesh load_mesh(const std::string& filename)
|
|
{
|
|
ConformalMesh mesh;
|
|
if (!read_mesh(filename, mesh))
|
|
throw std::runtime_error("conformallab: failed to read mesh from " + filename);
|
|
return mesh;
|
|
}
|
|
|
|
/// Throwing wrapper around `write_mesh`; throws `std::runtime_error` on
|
|
/// write failure.
|
|
inline void save_mesh(const std::string& filename, const ConformalMesh& mesh)
|
|
{
|
|
if (!write_mesh(filename, mesh))
|
|
throw std::runtime_error("conformallab: failed to write mesh to " + filename);
|
|
}
|
|
|
|
} // namespace conformallab
|