You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.4 KiB
86 lines
2.4 KiB
#include "save_msh_curves.h"
|
|
|
|
#include <mshio/MshSpec.h>
|
|
#include <mshio/exception.h>
|
|
|
|
#include <cassert>
|
|
|
|
namespace mshio {
|
|
|
|
namespace {
|
|
|
|
void save_curves_ascii(std::ostream& out, const MshSpec& spec)
|
|
{
|
|
#ifdef MSHIO_EXT_NANOSPLINE
|
|
const auto& curves = spec.curves;
|
|
out << curves.size() << std::endl;
|
|
|
|
for (const auto& curve : curves) {
|
|
out << curve.curve_tag << " ";
|
|
out << curve.curve_type << " ";
|
|
out << curve.curve_degree << " ";
|
|
out << curve.num_control_points << " ";
|
|
out << curve.num_knots << " ";
|
|
out << curve.with_weights << std::endl;
|
|
|
|
const size_t dim = (curve.with_weights > 0) ? 4 : 3;
|
|
const size_t num_entries = curve.num_control_points * dim + curve.num_knots;
|
|
assert(num_entries == curve.data.size());
|
|
|
|
for (size_t i = 0; i < curve.num_control_points; i++) {
|
|
for (size_t j = 0; j < dim; j++) {
|
|
out << curve.data[i * dim + j];
|
|
if (j + 1 == dim) {
|
|
out << std::endl;
|
|
} else {
|
|
out << " ";
|
|
}
|
|
}
|
|
}
|
|
|
|
for (size_t i = 0; i < curve.num_knots; i++) {
|
|
out << curve.data[curve.num_control_points * dim + i] << std::endl;
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void save_curves_binary(std::ostream& out, const MshSpec& spec)
|
|
{
|
|
#ifdef MSHIO_EXT_NANOSPLINE
|
|
const auto& curves = spec.curves;
|
|
out << curves.size() << std::endl;
|
|
|
|
for (const auto& curve : curves) {
|
|
out << curve.curve_tag << " ";
|
|
out << curve.curve_type << " ";
|
|
out << curve.curve_degree << " ";
|
|
out << curve.num_control_points << " ";
|
|
out << curve.num_knots << " ";
|
|
out << curve.with_weights << std::endl;
|
|
|
|
const size_t dim = (curve.with_weights > 0) ? 4 : 3;
|
|
const size_t num_entries = curve.num_control_points * dim + curve.num_knots;
|
|
assert(num_entries == curve.data.size());
|
|
|
|
out.write(reinterpret_cast<const char*>(curve.data.data()), sizeof(double) * num_entries);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
} // namespace
|
|
|
|
void save_curves(std::ostream& out, const MshSpec& spec)
|
|
{
|
|
const bool is_ascii = spec.mesh_format.file_type == 0;
|
|
|
|
out << "$Curves" << std::endl;
|
|
if (is_ascii) {
|
|
save_curves_ascii(out, spec);
|
|
} else {
|
|
save_curves_binary(out, spec);
|
|
}
|
|
out << "$EndCurves" << std::endl;
|
|
}
|
|
|
|
} // namespace mshio
|
|
|