SMTK  @SMTK_VERSION@
Simulation Modeling Tool Kit
SelectionFootprint.h
1 //=========================================================================
2 // Copyright (c) Kitware, Inc.
3 // All rights reserved.
4 // See LICENSE.txt for details.
5 //
6 // This software is distributed WITHOUT ANY WARRANTY; without even
7 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
8 // PURPOSE. See the above copyright notice for more information.
9 //=========================================================================
10 
11 #ifndef smtk_geometry_SelectionFootprint_h
12 #define smtk_geometry_SelectionFootprint_h
13 
14 #include "smtk/CoreExports.h"
15 
16 #include "smtk/geometry/Geometry.h"
17 #include "smtk/geometry/Resource.h"
18 
19 #include "smtk/resource/Component.h"
20 #include "smtk/resource/query/DerivedFrom.h"
21 #include "smtk/resource/query/Query.h"
22 
23 #include <unordered_set>
24 
25 namespace smtk
26 {
27 namespace geometry
28 {
29 
45 struct SMTKCORE_EXPORT SelectionFootprint
46  : public smtk::resource::query::DerivedFrom<SelectionFootprint, smtk::resource::query::Query>
47 {
56  virtual bool operator()(
57  smtk::resource::PersistentObject& selectedObject,
58  std::unordered_set<smtk::resource::PersistentObject*>& footprint,
59  const smtk::geometry::Backend& backend) const = 0;
60 
63  const
64  {
65  auto* resource = dynamic_cast<smtk::geometry::Resource*>(&object);
66  if (!resource)
67  {
68  auto* component = dynamic_cast<smtk::resource::Component*>(&object);
69  if (component)
70  {
71  resource = dynamic_cast<smtk::geometry::Resource*>(component->resource().get());
72  }
73  }
74  if (!resource)
75  {
76  return false;
77  }
78  auto& geom = resource->geometry(backend);
79  return geom &&
80  geom->generationNumber(object.shared_from_this()) != smtk::geometry::Geometry::Invalid;
81  }
82 
89  std::unordered_set<smtk::resource::PersistentObject*>& footprint,
90  const smtk::geometry::Backend& backend) const
91  {
92  auto* resource = dynamic_cast<smtk::geometry::Resource*>(&object);
93  if (!resource)
94  {
95  return false;
96  }
97  auto& geom = resource->geometry(backend);
98  if (!geom)
99  {
100  return false;
101  }
102  if (geom->generationNumber(object.shared_from_this()) == smtk::geometry::Geometry::Invalid)
103  {
104  bool hasFootprint = false;
105  auto visitor = [&hasFootprint, &footprint, &geom](
106  const resource::PersistentObject::Ptr& obj,
108  if (geom->generationNumber(obj) != smtk::geometry::Geometry::Invalid)
109  {
110  hasFootprint = true;
111  footprint.insert(obj.get());
112  }
113  return true;
114  };
115  geom->visit(visitor);
116  return hasFootprint;
117  }
118  return true; // Resource has geometry.
119  }
120 };
121 } // namespace geometry
122 } // namespace smtk
123 
124 #endif
smtk
The main namespace for the Simulation Modeling Tool Kit (SMTK).
Definition: doc.h:33
smtk::geometry::SelectionFootprint::hasGeometry
bool hasGeometry(smtk::resource::PersistentObject &object, const smtk::geometry::Backend &backend) const
Returns true iff the given object has geometry for backend .
Definition: SelectionFootprint.h:62
smtk::geometry::SelectionFootprint::addAllComponentsIfResource
bool addAllComponentsIfResource(smtk::resource::PersistentObject &object, std::unordered_set< smtk::resource::PersistentObject * > &footprint, const smtk::geometry::Backend &backend) const
If object is a Resource, add all the components it owns that have geometry.
Definition: SelectionFootprint.h:87
smtk::geometry::Geometry::Invalid
static constexpr GenerationNumber Invalid
A special generation number that marks an object as having no geometric representation.
Definition: Geometry.h:71
smtk::geometry::Resource::geometry
std::unique_ptr< Geometry > & geometry(const Backend &backend)
Given a backend, return a provider of geometry for that backend.
Definition: Resource.cxx:46
smtk::geometry::SelectionFootprint
An API for determining which components to render to display a selection.
Definition: SelectionFootprint.h:45
smtk::geometry::Backend
This is an empty class used by geometry providers to specify their interface.
Definition: Backend.h:28
smtk::resource::query::DerivedFrom
Query functors can be registered to Resources as the implementation of a base (and often abstract) Qu...
Definition: DerivedFrom.h:34
smtk::resource::Component
Component is the base class for records stored in an smtk::resource::Resource.
Definition: Component.h:43
smtk::geometry::Geometry::GenerationNumber
size_t GenerationNumber
An integral type to hold monotonically increasing generation numbers (a.k.a.
Definition: Geometry.h:68
smtk::resource::PersistentObject
An abstract base class for SMTK resources and their components.
Definition: PersistentObject.h:39
smtk::geometry::Resource
An abstract base class for SMTK resources that provide geometry for themselves and/or their component...
Definition: Resource.h:33