36 std::string extension = std::filesystem::path(filename).extension().string();
37 std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
39 if (extension ==
".vtu") {
41 auto reader = vtkSmartPointer<vtkXMLUnstructuredGridReader>::New();
42 reader->SetFileName(filename.c_str());
44 vtk_grid = reader->GetOutput();
46 if (!vtk_grid || vtk_grid->GetNumberOfPoints() == 0) {
47 throw std::runtime_error(
"Failed to read VTU file or file is empty");
49 }
else if (extension ==
".vtk") {
51 auto reader = vtkSmartPointer<vtkUnstructuredGridReader>::New();
52 reader->SetFileName(filename.c_str());
54 vtk_grid = reader->GetOutput();
56 if (!vtk_grid || vtk_grid->GetNumberOfPoints() == 0) {
57 throw std::runtime_error(
"Failed to read VTK file or file is empty");
60 throw std::runtime_error(
"Unsupported file extension: " + extension +
61 ". Supported extensions are .vtk and .vtu");
65 if (scaling_factor != 1.0) {
66 auto transform = vtkSmartPointer<vtkTransform>::New();
67 transform->Scale(scaling_factor, scaling_factor, scaling_factor);
69 auto transform_filter = vtkSmartPointer<vtkTransformFilter>::New();
70 transform_filter->SetInputData(vtk_grid);
71 transform_filter->SetTransform(transform);
72 transform_filter->Update();
74 vtk_grid = transform_filter->GetUnstructuredGridOutput();
78 std::cout <<
"Loaded VTK grid with:" << std::endl
79 <<
" Points: " << vtk_grid->GetNumberOfPoints() << std::endl
80 <<
" Cells: " << vtk_grid->GetNumberOfCells() << std::endl;
83 vtkPointData* point_data = vtk_grid->GetPointData();
84 std::cout <<
"Available point data arrays:" << std::endl;
85 for (
int i = 0; i < point_data->GetNumberOfArrays(); ++i) {
86 vtkDataArray* array = point_data->GetArray(i);
87 std::cout <<
" - " << array->GetName()
88 <<
" (components: " << array->GetNumberOfComponents() <<
")"
96 const unsigned int component)
98 field_name = field_name_;
99 data_location = data_location_;
100 selected_component = component;
103 if (data_location == DataLocation::PointData) {
104 field_data = vtk_grid->GetPointData()->GetArray(field_name.c_str());
106 throw std::runtime_error(
"Point data array '" + field_name +
"' not found");
110 point_locator = vtkSmartPointer<vtkPointLocator>::New();
111 point_locator->SetDataSet(vtk_grid);
112 point_locator->BuildLocator();
114 field_data = vtk_grid->GetCellData()->GetArray(field_name.c_str());
116 throw std::runtime_error(
"Cell data array '" + field_name +
"' not found");
120 cell_locator = vtkSmartPointer<vtkCellLocator>::New();
121 cell_locator->SetDataSet(vtk_grid);
122 cell_locator->BuildLocator();
126 if (selected_component >=
static_cast<unsigned int>(field_data->GetNumberOfComponents())) {
127 throw std::runtime_error(
"Invalid component index " + std::to_string(selected_component) +
128 " for field '" + field_name +
"' with " +
129 std::to_string(field_data->GetNumberOfComponents()) +
" components");
136 double closest_point[3];
137 vtkIdType closest_id;
138 double closest_dist2;
141 if (data_location == DataLocation::PointData) {
143 double point[3] = {p[0], p[1], p[2]};
144 closest_id = point_locator->FindClosestPoint(point);
148 field_data->GetTuple(closest_id, tuple);
149 value = tuple[selected_component];
152 auto cell = vtkSmartPointer<vtkGenericCell>::New();
153 double x[3] = {p[0], p[1], p[2]};
156 cell_locator->FindClosestPoint(x, closest_point, cell, closest_id,
157 subId, closest_dist2);
161 field_data->GetTuple(closest_id, tuple);
162 value = tuple[selected_component];
void setup_field(const std::string &field_name, const DataLocation data_location=DataLocation::PointData, const unsigned int component=0)
Sets up the field to be used for interpolation.