#pragma once#include<itkImage.h>#include<vnl/vnl_vector.h>#include<vtkPolyData.h>#include<vtkSmartPointer.h>#include<vtkTransform.h>#include<Eigen/Dense>#include<Eigen/Sparse>#include<QSharedPointer>#include<QString>usingPixelType=float;usingImageType=itk::Image<PixelType,3>;classvtkFloatArray;classvtkStaticPointLocator;namespaceshapeworks{classStudioMesh;usingMeshHandle=std::shared_ptr<StudioMesh>;usingMeshList=std::vector<MeshHandle>;classStudioMesh{public:StudioMesh();~StudioMesh();QStringget_dimension_string();vtkSmartPointer<vtkPolyData>get_poly_data();vnl_vector<double>get_center_transform();voidset_poly_data(vtkSmartPointer<vtkPolyData>poly_data);voidset_error_message(std::stringerror_message);std::stringget_error_message();voidapply_feature_map(std::stringname,ImageType::Pointerimage);voidapply_scalars(MeshHandlemesh);voidinterpolate_scalars_to_mesh(std::stringname,Eigen::VectorXdpositions,Eigen::VectorXfscalar_values);doubleget_largest_dimension_size();vtkFloatArray*get_or_create_array(std::stringname,floatdefault_value);voidpaint_ffc(doubleworld_pos[],doubleradius,boolinclusive);boolhas_ffc_paint();staticconstexprconstchar*constFFC_PAINT="ffc_paint";private:// metadataintdimensions_[3];vnl_vector<double>center_transform_;// the polydatavtkSmartPointer<vtkPolyData>poly_data_;vtkSmartPointer<vtkStaticPointLocator>locator_;// error message if the polydata didn't loadstd::stringerror_message_;};}// namespace shapeworks