7 #include "imstkCompoundGeometry.h" 9 #include "imstkAnalyticalGeometry.h" 10 #include "imstkLogger.h" 20 std::for_each(m_geometries.begin(), m_geometries.end(), [](
const auto& geom) { geom.geometry->print(); });
27 return std::accumulate(m_geometries.begin(), m_geometries.end(), 0.0, [](
auto val,
auto& geom)
28 {
return val + geom.geometry->getVolume(); });
34 Eigen::AlignedBox3d box;
37 for (
auto geom : m_geometries)
41 geom.geometry->computeBoundingBox(localLowLeft, localUpRight, paddingPercent);
42 box.extend(Eigen::AlignedBox3d(localLowLeft, localUpRight));
44 lowerCorner = box.corner(Eigen::AlignedBox3d::BottomLeftFloor);
45 upperCorner = box.corner(Eigen::AlignedBox3d::TopRightCeil);
52 return std::accumulate(m_geometries.begin(), m_geometries.end(), Vec3d(0, 0, 0), [](
auto val,
auto& geom)
53 {
return val + geom.geometry->getCenter(); }) / m_geometries.size();
66 if (!m_transformApplied)
68 std::for_each(m_geometries.begin(), m_geometries.end(), [
this](
auto& geom) {
71 CHECK(geom.geometry !=
nullptr);
73 geom.geometry->updatePostTransformData();
76 m_transformApplied =
true;
82 std::for_each(m_geometries.begin(), m_geometries.end(), [&mat](
auto& geom) {
83 auto transform = mat * geom.localTransform;
86 geom.geometry->updatePostTransformData();
88 m_transformApplied =
true;
94 if (index >= m_geometries.size())
98 m_transformApplied =
false;
99 m_geometries[index].localTransform =
transform;
102 std::shared_ptr<imstk::Geometry>
105 if (index < m_geometries.size())
107 return m_geometries[index].geometry;
118 if (std::find_if(m_geometries.begin(), m_geometries.end(), [
this, geometry](
auto& geom) {
return geom.geometry == geometry; }) == m_geometries.end())
120 m_geometries.push_back({ geometry, Mat4d::Identity() });
124 LOG(WARNING) <<
"Added duplicate geometry to compound geometry, ignored " << geometry->getName();
129 imstk::CompoundGeometry::cloneImplementation()
const 131 throw std::logic_error(
"The method or operation is not implemented.");
Mat4d m_transform
Transformation matrix.
void applyTransform(const Mat4d &) override
Directly apply transform to data.
void print() const override
Print.
double getVolume() override
Returns the volume of the geometry (if valid)
void transform(const Mat4d &T, TransformType type=TransformType::ConcatenateToTransform)
Applies a rigid transform to the geometry.
Base class for any geometrical representation.
void setLocalTransform(size_t index, const Mat4d &transform)
void updatePostTransformData() const override
void add(std::shared_ptr< AnalyticalGeometry > geometry)
Adds a geometry to the compound geometry.
std::shared_ptr< Geometry > get(size_t index) const
void computeBoundingBox(Vec3d &lowerCorner, Vec3d &upperCorner, const double paddingPercent=0.0) override
Compute the bounding box for the geometry.
bool isMesh() const override
Returns true if the geometry is a mesh, else returns false.
Vec3d getCenter() override
Returns the bounding box center.