SegmentMesh-inl.h
Go to the documentation of this file.
// This file is a part of the OpenSurgSim project.
// Copyright 2013, SimQuest Solutions Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef SURGSIM_DATASTRUCTURES_SEGMENTMESH_INL_H
#define SURGSIM_DATASTRUCTURES_SEGMENTMESH_INL_H
#include "SurgSim/Framework/Log.h"
namespace SurgSim
{
namespace DataStructures
{
template <class VertexData, class EdgeData>
SegmentMesh<VertexData, EdgeData>::SegmentMesh()
{
}
template <class VertexData, class EdgeData>
SegmentMesh<VertexData, EdgeData>::SegmentMesh(
const SegmentMesh<VertexData, EdgeData>& other) :
TriangleMeshType(other)
{
}
template <class VertexData, class EdgeData>
template <class V, class E>
SegmentMesh<VertexData, EdgeData>::SegmentMesh(const SegmentMesh<V, E>& other) :
TriangleMeshType(other)
{
}
template <class VertexData, class EdgeData>
SegmentMesh<VertexData, EdgeData>::~SegmentMesh()
{
}
template <class VertexData, class EdgeData>
SegmentMesh<VertexData, EdgeData>::SegmentMesh(SegmentMesh<VertexData, EdgeData>&& other) :
TriangleMeshType(std::move(other))
{
}
template <class VertexData, class EdgeData>
SegmentMesh<VertexData, EdgeData>& SegmentMesh<VertexData, EdgeData>::operator=(
const SegmentMesh<VertexData, EdgeData>& other)
{
return TriangleMeshType::operator=(other);
}
template <class VertexData, class EdgeData>
SegmentMesh<VertexData, EdgeData>& SegmentMesh<VertexData, EdgeData>::operator=(
SegmentMesh<VertexData, EdgeData>&& other)
{
return TriangleMeshType::operator=(std::move(other));
}
template <class VertexData, class EdgeData>
size_t SegmentMesh<VertexData, EdgeData>::addTriangle(const TriangleType& triangle)
{
SURGSIM_FAILURE() << "Cannot insert triangle into segment mesh.";
return static_cast<size_t>(0);
}
template <class VertexData, class EdgeData>
size_t SegmentMesh<VertexData, EdgeData>::getNumTriangles() const
{
SURGSIM_FAILURE() << "No triangles present in segment mesh.";
return static_cast<size_t>(0);
}
template <class VertexData, class EdgeData>
const std::vector<typename SegmentMesh<VertexData, EdgeData>::TriangleType>&
SegmentMesh<VertexData, EdgeData>::getTriangles() const
{
SURGSIM_FAILURE() << "No triangles present in segment mesh.";
return TriangleMeshType::getTriangles();
}
template <class VertexData, class EdgeData>
std::vector<typename SegmentMesh<VertexData, EdgeData>::TriangleType>&
SegmentMesh<VertexData, EdgeData>::getTriangles()
{
SURGSIM_FAILURE() << "No triangles present in segment mesh.";
return TriangleMeshType::getTriangles();
}
template <class VertexData, class EdgeData>
const typename SegmentMesh<VertexData, EdgeData>::TriangleType&
SegmentMesh<VertexData, EdgeData>::getTriangle(size_t id) const
{
SURGSIM_FAILURE() << "No triangles present in segment mesh.";
return TriangleMeshType::getTriangle(id);
}
template <class VertexData, class EdgeData>
typename SegmentMesh<VertexData, EdgeData>::TriangleType&
SegmentMesh<VertexData, EdgeData>::getTriangle(size_t id)
{
SURGSIM_FAILURE() << "No triangles present in segment mesh.";
return TriangleMeshType::getTriangle(id);
}
template <class VertexData, class EdgeData>
void SegmentMesh<VertexData, EdgeData>::removeTriangle(size_t id)
{
SURGSIM_FAILURE() << "No triangles present in segment mesh.";
}
template <class VertexData, class EdgeData>
std::array<SurgSim::Math::Vector3d, 3>
SegmentMesh<VertexData, EdgeData>::getTrianglePositions(size_t id) const
{
using SurgSim::Math::Vector3d;
SURGSIM_FAILURE() << "No triangles present in segment mesh.";
std::array<Vector3d, 3> result =
{
{
Vector3d::Zero(),
Vector3d::Zero(),
Vector3d::Zero()
}
};
return result;
}
template <class VertexData, class EdgeData>
void SegmentMesh<VertexData, EdgeData>::doClearTriangles()
{
SURGSIM_FAILURE() << "No triangles present in segment mesh.";
}
template <class VertexData, class EdgeData>
void SegmentMesh<VertexData, EdgeData>::doClear()
{
TriangleMeshType::doClearEdges();
TriangleMeshType::doClearVertices();
}
template <class VertexData, class EdgeData>
void SurgSim::DataStructures::SegmentMesh<VertexData, EdgeData>::createDefaultEdges()
{
doClearEdges();
for (size_t i = 0; i < getNumVertices() - 1; ++i)
{
std::array<size_t, 2> vertices = { i, i + 1 };
EdgeType edge(vertices);
addEdge(edge);
}
}
template <class VertexData, class EdgeData>
bool SegmentMesh<VertexData, EdgeData>::save(const std::string& fileName,
bool asPhysics,
double radius,
double massDensity,
double poissonRatio,
double youngsModulus)
{
std::fstream out(fileName, std::ios::out);
if (out.is_open())
{
out << "ply" << std::endl;
out << "format ascii 1.0" << std::endl;
out << "comment Created by OpenSurgSim, www.opensurgsim.org" << std::endl;
out << "element vertex " << getNumVertices() << std::endl;
out << "property float x\nproperty float y\nproperty float z" << std::endl;
if (asPhysics)
{
out << "element 1d_element " << getNumEdges() << std::endl;
out << "property list uint uint vertex_indices" << std::endl;
out << "element radius 1" << std::endl;
out << "property double value" << std::endl;
out << "element material 1" << std::endl;
out << "property double mass_density" << std::endl;
out << "property double poisson_ratio" << std::endl;
out << "property double young_modulus" << std::endl;
out << "element boundary_condition 0" << std::endl;
out << "property uint vertex_index" << std::endl;
}
else
{
out << "element edge " << getNumEdges() << std::endl;
out << "property uint vertex1" << std::endl;
out << "property uint vertex2" << std::endl;
}
out << "end_header" << std::endl;
for (const auto& vertex : getVertices())
{
out << vertex.position[0] << " " << vertex.position[1] << " " << vertex.position[2] << std::endl;
}
for (const auto& edge : getEdges())
{
if (asPhysics)
{
out << "2 ";
}
out << edge.verticesId[0] << " " << edge.verticesId[1] << std::endl;
}
if (asPhysics)
{
out << radius << std::endl;
out << massDensity << " " << poissonRatio << " " << youngsModulus << std::endl;
}
if (out.bad())
{
SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << __FUNCTION__
<< "There was a problem writing " << fileName;
}
out.close();
}
else
{
SURGSIM_LOG_WARNING(SurgSim::Framework::Logger::getDefaultLogger()) << __FUNCTION__
<< "Could not open " << fileName << " for writing.";
return false;
}
return true;
}
} // namespace DataStructures
} // namespace SurgSim
#endif // SURGSIM_DATASTRUCTURES_SEGMENTMESH_INL_H
SurgSim
Definition: CompoundShapeToGraphics.cpp:29
SurgSim::DataStructures::TriangleMesh< VertexData, EdgeData, SegmentEmptyData >::getTriangle
const TriangleType & getTriangle(size_t id) const
Retrieve a specific triangle.
Definition: TriangleMesh-inl.h:179
SurgSim::DataStructures::SegmentMesh::addTriangle
size_t addTriangle(const TriangleType &triangle)
Definition: SegmentMesh-inl.h:72
SurgSim::DataStructures::Vertices::getNumVertices
size_t getNumVertices() const
Returns the number of vertices in this mesh.
Definition: Vertices-inl.h:99
SurgSim::DataStructures::SegmentMesh::doClearTriangles
void doClearTriangles() override
Definition: SegmentMesh-inl.h:141
SURGSIM_LOG_WARNING
#define SURGSIM_LOG_WARNING(logger)
Logs a message to the specified logger at the WARNING level.
Definition: LogMacros.h:96
SurgSim::DataStructures::SegmentMesh::~SegmentMesh
virtual ~SegmentMesh()
Destructor.
Definition: SegmentMesh-inl.h:47
SurgSim::DataStructures::SegmentMesh::SegmentMesh
SegmentMesh()
Constructor. The mesh is initially empty (no vertices, no edges).
Definition: SegmentMesh-inl.h:28
std
STL namespace.
SURGSIM_FAILURE
#define SURGSIM_FAILURE()
Report that something very bad has happened and abort program execution.
Definition: Assert.h:95
Log.h
The convenience header that provides the entirety of the logging API.
SurgSim::DataStructures::Vertices::getVertices
const std::vector< VertexType > & getVertices() const
Returns a vector containing the position of each vertex.
Definition: Vertices-inl.h:117
SurgSim::DataStructures::SegmentMesh::removeTriangle
void removeTriangle(size_t id)
Definition: SegmentMesh-inl.h:118
SurgSim::DataStructures::TriangleMesh< VertexData, EdgeData, SegmentEmptyData >::getTriangles
const std::vector< TriangleType > & getTriangles() const
Retrieve all triangles.
Definition: TriangleMesh-inl.h:137
SurgSim::DataStructures::SegmentMesh
Class to hold the type of a SegmentMesh.
Definition: SegmentMesh.h:33
SurgSim::DataStructures::TriangleMesh< VertexData, EdgeData, SegmentEmptyData >::doClearEdges
virtual void doClearEdges()
Remove all edges from the mesh.
Definition: TriangleMesh-inl.h:259
SurgSim::DataStructures::SegmentMesh::doClear
void doClear() override
Clear mesh to return to an empty state (no vertices, no edges).
Definition: SegmentMesh-inl.h:147
SurgSim::DataStructures::SegmentMesh::getNumTriangles
size_t getNumTriangles() const
Definition: SegmentMesh-inl.h:79
SurgSim::DataStructures::SegmentMesh::createDefaultEdges
void createDefaultEdges()
Creates edges for all vertices in the mesh connecting all the points consecutively.
Definition: SegmentMesh-inl.h:154
SurgSim::DataStructures::TriangleMesh< VertexData, EdgeData, SegmentEmptyData >::operator=
TriangleMesh< VertexData, EdgeData, SegmentEmptyData > & operator=(const TriangleMesh< VertexData, EdgeData, SegmentEmptyData > &other)
Copy Assignment.
Definition: TriangleMesh-inl.h:322
SurgSim::DataStructures::TriangleMesh< VertexData, EdgeData, SegmentEmptyData >::addEdge
size_t addEdge(const EdgeType &edge)
Adds an edge to the mesh.
Definition: TriangleMesh-inl.h:81
SurgSim::DataStructures::TriangleMesh< VertexData, EdgeData, SegmentEmptyData >
SurgSim::DataStructures::MeshElement
Element structure for meshes.
Definition: MeshElement.h:44
SurgSim::DataStructures::SegmentMesh::getTrianglePositions
std::array< SurgSim::Math::Vector3d, 3 > getTrianglePositions(size_t id) const
Definition: SegmentMesh-inl.h:125
SurgSim::Framework::Logger::getDefaultLogger
static std::shared_ptr< Logger > getDefaultLogger()
Get default logger.
Definition: Logger.h:116
SurgSim::DataStructures::Vertices::doClearVertices
virtual void doClearVertices()
Remove all vertices from the mesh.
Definition: Vertices-inl.h:178
SurgSim::DataStructures::SegmentMesh::getTriangle
const TriangleType & getTriangle(size_t id) const
Definition: SegmentMesh-inl.h:103
SurgSim::DataStructures::TriangleMesh< VertexData, EdgeData, SegmentEmptyData >::getEdges
const std::vector< EdgeType > & getEdges() const
Retrieve all edges.
Definition: TriangleMesh-inl.h:123
SurgSim::DataStructures::SegmentMesh::operator=
SegmentMesh< VertexData, EdgeData > & operator=(const SegmentMesh< VertexData, EdgeData > &other)
Copy Assignment.
Definition: SegmentMesh-inl.h:58
SurgSim::Math::Vector3d
Eigen::Matrix< double, 3, 1 > Vector3d
A 3D vector of doubles.
Definition: Vector.h:57
SurgSim::DataStructures::SegmentMesh::TriangleType
TriangleMeshType::TriangleType TriangleType
Triangle type for convenience (Ids of the 3 vertices)
Definition: SegmentMesh.h:41
SurgSim::DataStructures::SegmentMesh::save
bool save(const std::string &fileName, bool asPhysics=true, double radius=0.0001, double massDensity=900, double poissonRatio=0.45, double youngsModulus=1.75e9)
Save the current structure to a ply file.
Definition: SegmentMesh-inl.h:167
SurgSim::DataStructures::SegmentMesh::getTriangles
const std::vector< TriangleType > & getTriangles() const
Definition: SegmentMesh-inl.h:87
SurgSim::DataStructures::TriangleMesh< VertexData, EdgeData, SegmentEmptyData >::getNumEdges
size_t getNumEdges() const
Get the number of edges.
Definition: TriangleMesh-inl.h:110