1#ifndef TATOOINE_DETAIL_UNSTRUCTURED_SIMPLICIAL_GRID_TRIANGULAR_VTP_WRITER_H
2#define TATOOINE_DETAIL_UNSTRUCTURED_SIMPLICIAL_GRID_TRIANGULAR_VTP_WRITER_H
14template <
typename Grid, unsigned_integral HeaderType = std::uint64_t,
15 integral ConnectivityInt = std::int64_t,
16 integral OffsetInt = std::int64_t>
17requires(Grid::num_dimensions() == 2 || Grid::num_dimensions() == 3)
27 auto write(filesystem::path
const& path)
const {
28 auto file = std::ofstream{path};
29 if (!file.is_open()) {
30 throw std::runtime_error{
"Could open file " + path.string() +
33 auto offset = std::size_t{};
34 write_vtk_file(file, offset);
39 auto const num_bytes_points =
40 HeaderType(
sizeof(
typename Grid::real_type) * 3 * m_grid.vertices().size());
41 auto const num_bytes_connectivity = m_grid.simplices().size() *
42 m_grid.num_vertices_per_simplex() *
43 sizeof(ConnectivityInt);
44 auto const num_bytes_offsets =
sizeof(OffsetInt) * m_grid.simplices().size();
46 <<
" type=\"PolyData\""
48 <<
" byte_order=\"LittleEndian\""
51 vtk::xml::to_data_type<HeaderType>())
55 <<
" NumberOfPoints=\"" << m_grid.vertices().size() <<
"\""
56 <<
" NumberOfPolys=\"" << m_grid.simplices().size() <<
"\""
57 <<
" NumberOfVerts=\"0\""
58 <<
" NumberOfLines=\"0\""
59 <<
" NumberOfStrips=\"0\""
64 <<
" format=\"appended\""
65 <<
" offset=\"" << offset <<
"\""
68 vtk::xml::to_data_type<typename Grid::real_type>())
69 <<
"\" NumberOfComponents=\"3\"/>"
71 offset += num_bytes_points +
sizeof(HeaderType);
75 <<
"<DataArray format=\"appended\" offset=\"" << offset <<
"\" type=\""
77 vtk::xml::to_data_type<ConnectivityInt>())
78 <<
"\" Name=\"connectivity\"/>\n";
79 offset += num_bytes_connectivity +
sizeof(HeaderType);
81 file <<
"<DataArray format=\"appended\" offset=\"" << offset <<
"\" type=\""
83 vtk::xml::to_data_type<OffsetInt>())
84 <<
"\" Name=\"offsets\"/>\n";
85 offset += num_bytes_offsets +
sizeof(HeaderType);
89 <<
"<AppendedData encoding=\"raw\">\n_";
92 using namespace std::ranges;
94 file.write(
reinterpret_cast<char const*
>(&num_bytes_points),
96 if constexpr (Grid::num_dimensions() == 2) {
97 auto point_data = std::vector<vec<typename Grid::real_type, 3>>(
98 m_grid.vertices().size());
99 auto position = [
this](
auto const v) ->
auto& {
return m_grid[v]; };
100 constexpr auto to_3d = [](
auto const& p) {
103 auto it =
begin(point_data);
104 for (
auto const v : m_grid.vertices()) {
105 *it = to_3d(m_grid[v]);
111 file.write(
reinterpret_cast<char const*
>(point_data.data()),
113 }
else if constexpr (Grid::num_dimensions() == 3) {
114 file.write(
reinterpret_cast<char const*
>(m_grid.vertices().data()),
121 auto connectivity_data = std::vector<ConnectivityInt>(
122 m_grid.simplices().size() * m_grid.num_vertices_per_simplex());
123 auto index = [](
auto const x) -> ConnectivityInt {
return x.index(); };
124 copy(m_grid.simplices().data_container() | views::transform(
index),
125 begin(connectivity_data));
126 file.write(
reinterpret_cast<char const*
>(&num_bytes_connectivity),
128 file.write(
reinterpret_cast<char const*
>(connectivity_data.data()),
129 num_bytes_connectivity);
134 auto offsets = std::vector<OffsetInt>(m_grid.simplices().size(),
135 m_grid.num_vertices_per_simplex());
136 for (std::size_t i = 1; i <
size(offsets); ++i) {
137 offsets[i] += offsets[i - 1];
139 file.write(
reinterpret_cast<char const*
>(&num_bytes_offsets),
141 file.write(
reinterpret_cast<char const*
>(offsets.data()),
144 file <<
"\n</AppendedData>\n"
Definition: edge_vtp_writer.h:12
auto size(simplex_container< Real, NumDimensions, SimplexDim > simplices)
Definition: simplex_container.h:89
auto begin(simplex_container< Real, NumDimensions, SimplexDim > simplices)
Definition: simplex_container.h:79
auto to_string(data_type const t) -> std::string_view
auto constexpr index(handle< Child, Int > const h)
Definition: handle.h:119
Definition: triangular_vtp_writer.h:18
auto write(filesystem::path const &path) const
Definition: triangular_vtp_writer.h:27
typename Grid::template typed_vertex_property_type< T > typed_vertex_property_type
Definition: triangular_vtp_writer.h:23
static auto constexpr num_dimensions()
Definition: triangular_vtp_writer.h:19
typename Grid::vertex_property_type vertex_property_type
Definition: triangular_vtp_writer.h:20
auto write_vtk_file(std::ofstream &file, auto &offset) const
Definition: triangular_vtp_writer.h:38
Grid const & m_grid
Definition: triangular_vtp_writer.h:25