7 #include "imstkHexahedralMesh.h" 8 #include "imstkLogger.h" 9 #include "imstkMacros.h" 10 #include "imstkTetrahedralMesh.h" 11 #include "imstkVecDataArray.h" 12 #include "imstkVegaMeshIO.h" 15 DISABLE_WARNING_HIDES_CLASS_MEMBER
18 #include <volumetricMeshLoader.h> 24 std::shared_ptr<PointSet>
27 CHECK(meshType == MeshFileType::VEG) <<
"@VegaMeshIO::read error: input file type is not veg for input " << filePath;
39 CHECK(meshType == MeshFileType::VEG) <<
"@VegaMeshIO::write error: file type is not veg for input " << filePath;
42 auto imstkVolMesh = std::dynamic_pointer_cast<
PointSet>(imstkMesh);
44 CHECK(imstkVolMesh !=
nullptr) <<
"@VegaMeshIO::write error: imstk::PointSet object supplied is not a imstk::VolumetricMesh type for input" << filePath;
46 const std::string geometryType = imstkVolMesh->getTypeName();
47 if (geometryType == TetrahedralMesh::getStaticTypeName() || geometryType == HexahedralMesh::getStaticTypeName())
51 CHECK(vegaMesh !=
nullptr) <<
"@VegaMeshIO::write error: failed to convert volumetric mesh to vega mesh for input" << filePath;
53 const auto fileName =
const_cast<char*
>(filePath.c_str());
54 const int write_status = vegaMesh->save(fileName);
56 CHECK(write_status == 0) <<
"@VegaMeshIO::write error: failed (vega fail code " << write_status <<
57 ". Check vega::VolumetricMesh::save for documentation)to write .veg file for input" << filePath;
62 LOG(WARNING) <<
"Error: Unknown element type (only tetrahedral and hexahedral elements supported) for input " << filePath;
66 std::shared_ptr<vega::VolumetricMesh>
69 auto fileName =
const_cast<char*
>(filePath.c_str());
70 std::shared_ptr<vega::VolumetricMesh> vegaMesh(vega::VolumetricMeshLoader::load(fileName));
74 std::shared_ptr<PointSet>
78 std::shared_ptr<VecDataArray<double, 3>> vertices = std::make_shared<VecDataArray<double, 3>>();
79 VegaMeshIO::copyVertices(vegaMesh, *vertices);
82 auto cellType = vegaMesh->getElementType();
83 std::shared_ptr<PointSet> mesh;
84 if (cellType == vega::VolumetricMesh::TET)
86 std::shared_ptr<VecDataArray<int, 4>> cellsPtr = std::make_shared<VecDataArray<int, 4>>();
88 VegaMeshIO::copyCells<4>(vegaMesh, cells);
90 auto tetMesh = std::make_shared<TetrahedralMesh>();
91 tetMesh->initialize(vertices, cellsPtr);
94 else if (cellType == vega::VolumetricMesh::CUBIC)
96 std::shared_ptr<VecDataArray<int, 8>> cellsPtr = std::make_shared<VecDataArray<int, 8>>();
98 VegaMeshIO::copyCells<8>(vegaMesh, cells);
100 auto hexMesh = std::make_shared<HexahedralMesh>();
101 hexMesh->initialize(vertices, cellsPtr);
107 LOG(WARNING) <<
"Error: invalid cell type";
114 VegaMeshIO::copyVertices(std::shared_ptr<vega::VolumetricMesh> vegaMesh,
117 for (
int i = 0; i < vegaMesh->getNumVertices(); ++i)
119 auto pos = vegaMesh->getVertex(i);
120 vertices.
push_back(Vec3d(pos[0], pos[1], pos[2]));
126 VegaMeshIO::copyCells(std::shared_ptr<vega::VolumetricMesh> vegaMesh,
129 typename VecDataArray<int, dim>::ValueType cell;
130 for (
int cellId = 0; cellId < vegaMesh->getNumElements(); ++cellId)
132 for (
int i = 0; i < vegaMesh->getNumElementVertices(); ++i)
134 cell[i] = vegaMesh->getVertexIndex(static_cast<int>(cellId), i);
140 std::shared_ptr<vega::VolumetricMesh>
144 if (imstkVolMesh->getTypeName() == TetrahedralMesh::getStaticTypeName())
149 std::vector<double> vertices;
150 for (
const auto& node : vertexArray)
152 vertices.emplace_back(node(0));
153 vertices.emplace_back(node(1));
154 vertices.emplace_back(node(2));
158 std::vector<int> elements;
159 for (
const Vec4i& tet : tetArray)
161 elements.emplace_back(
int(tet[0]));
162 elements.emplace_back(
int(tet[1]));
163 elements.emplace_back(
int(tet[2]));
164 elements.emplace_back(
int(tet[3]));
168 auto vegaMesh = std::make_shared<vega::TetMesh>(int(imstkVolTetMesh->getNumVertices()),
170 int(imstkVolTetMesh->getNumCells()),
176 CHECK(vegaMesh !=
nullptr) <<
"@VegaMeshIO::convertVolumetricMeshToVegaMesh error: Failed to create vega mesh. " 177 <<
"Check vega::TetMesh::TetMesh() for clues";
183 LOG(WARNING) <<
"Error: Geometry type other than tetrahedral mesh not supported";
Base class for all geometries represented by discrete points and elements The pointsets follow a pipe...
static std::shared_ptr< PointSet > convertVegaMeshToVolumetricMesh(std::shared_ptr< vega::VolumetricMesh > vegaVolumeMesh)
Generate volumetric mesh given a vega volume mesh.
MeshFileType
Enumeration the mesh file type.
void push_back(const ValueType &val)
Append the data array to hold the new value, resizes if neccesary.
Represents a set of tetrahedrons & vertices via an array of Vec3d double vertices & Vec4i integer ind...
std::shared_ptr< VecDataArray< double, 3 > > getVertexPositions(DataType type=DataType::PostTransform) const
Returns the vector of current positions of the mesh vertices.
static bool write(const std::shared_ptr< imstk::PointSet > imstkMesh, const std::string &filePath, const MeshFileType meshType)
Write a volumetric mesh in vega file format.
static std::shared_ptr< PointSet > read(const std::string &filePath, MeshFileType meshType)
Read and generate volumetric mesh given a external vega mesh file.
static std::shared_ptr< vega::VolumetricMesh > convertVolumetricMeshToVegaMesh(const std::shared_ptr< PointSet > volumeMesh)
Generate a vega volume mesh given volumetric mesh.
static std::shared_ptr< vega::VolumetricMesh > readVegaMesh(const std::string &filePath)
Read vega volume mesh from a file.