SMTK  @SMTK_VERSION@
Simulation Modeling Tool Kit
Entity.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 #ifndef smtk_model_Entity_h
11 #define smtk_model_Entity_h
12 
13 #include "smtk/CoreExports.h" // for SMTKCORE_EXPORT macro
14 #include "smtk/SystemConfig.h"
15 
16 #include "smtk/resource/Component.h"
17 
18 #include "smtk/model/Arrangement.h" // for Arrangement, ArrangementKind
19 #include "smtk/model/EntityTypeBits.h" // for entityFlags values
20 #include "smtk/model/IntegerData.h" // for IntegerList
21 #include "smtk/model/StringData.h" // for StringList
22 
23 #include <map>
24 #include <set>
25 #include <sstream>
26 #include <string>
27 #include <vector>
28 
29 namespace smtk
30 {
31 namespace model
32 {
33 
46 class SMTKCORE_EXPORT Entity : public smtk::resource::Component
47 {
48  friend class smtk::model::Resource;
49 
50 public:
51  using UUID = smtk::common::UUID;
52  using QueryFunctor = std::function<bool(const smtk::resource::Component&)>;
53  //using ResourcePtr = smtk::resource::ResourcePtr;
54 
57  ~Entity() override;
58 
59  static EntityPtr create(
60  const UUID& uid,
61  BitFlags entityFlags = EntityTypeBits::INVALID,
62  ResourcePtr resource = nullptr);
63  static EntityPtr create(BitFlags entityFlags, int dimension, ResourcePtr resource = nullptr);
64  EntityPtr setup(
65  BitFlags entityFlags,
66  int dimension,
67  ResourcePtr resource = nullptr,
68  bool resetRelations = true);
69 
70  const smtk::resource::ResourcePtr resource() const override;
71  ResourcePtr modelResource() const;
72 
74  EntityPtr owningModel() const;
75 
77  template<typename T>
78  T referenceAs() const
79  {
80  return T(this->modelResource(), this->id());
81  }
82 
83  bool reparent(ResourcePtr newParent);
84 
85  std::string name() const override;
86 
87  int dimension() const;
88  BitFlags dimensionBits() const;
89  BitFlags entityFlags() const;
90  bool setEntityFlags(BitFlags flags);
91 
92  smtk::common::UUIDArray& relations();
93  const smtk::common::UUIDArray& relations() const;
94 
95  int appendRelation(const smtk::common::UUID& b, bool useHoles = true);
96  EntityPtr pushRelation(const smtk::common::UUID& b);
97  EntityPtr removeRelation(const smtk::common::UUID& b);
98  void resetRelations();
99 
100  int findOrAppendRelation(const smtk::common::UUID& r);
101  int invalidateRelation(const smtk::common::UUID& r);
102  int invalidateRelationByIndex(int relIdx);
103 
104  std::string flagSummary(int form = 0) const
105  {
106  return Entity::flagSummary(this->entityFlags(), form);
107  }
108  std::string flagDescription(int form = 0) const
109  {
110  return Entity::flagDescription(this->entityFlags(), form);
111  }
112 
113  static std::string flagDimensionList(BitFlags entityFlags, bool& plural);
114  static std::string flagSummaryHelper(BitFlags entityFlags, int form = 0);
115  static std::string flagSummary(BitFlags entityFlags, int form = 0);
116  static std::string flagDescription(BitFlags entityFlags, int form = 0);
117  static int countForType(BitFlags flags, IntegerList& counters, bool incr = false);
118  static std::string
119  defaultNameFromCounters(BitFlags entityFlags, IntegerList& counters, bool incr = true);
120  static std::string flagToSpecifierString(BitFlags flagsOrMask, bool textual = true);
121  static BitFlags specifierStringToFlag(const std::string& spec);
122  static BitFlags dimensionToDimensionBits(int dim);
123  static int dimensionBitsToDimension(BitFlags dimBits);
124 
125  static QueryFunctor filterStringToQueryFunctor(const std::string& spec);
126 
127  int arrange(ArrangementKind, const Arrangement& arr, int index = -1);
128  int unarrange(ArrangementKind, int index, bool removeIfLast = false);
129  bool clearArrangements();
130 
131  const Arrangements* hasArrangementsOfKind(ArrangementKind) const;
132  Arrangements* hasArrangementsOfKind(ArrangementKind);
133 
134  Arrangements& arrangementsOfKind(ArrangementKind);
135 
136  const Arrangement* findArrangement(ArrangementKind kind, int index) const;
137  Arrangement* findArrangement(ArrangementKind kind, int index);
139  bool findDualArrangements(ArrangementKind kind, int index, ArrangementReferences& duals) const;
140 
141  const KindsToArrangements& arrangementMap() const { return m_arrangements; }
142 
143  const common::UUID& id() const override { return m_id; }
144  bool setId(const common::UUID& uid) override
145  {
146  m_id = uid;
147  return true;
148  }
149 
150  bool isCellEntity() const { return smtk::model::isCellEntity(this->entityFlags()); }
151  bool isUseEntity() const { return smtk::model::isUseEntity(this->entityFlags()); }
152  bool isShellEntity() const { return smtk::model::isShellEntity(this->entityFlags()); }
153  bool isGroup() const { return smtk::model::isGroup(this->entityFlags()); }
154  bool isModel() const { return smtk::model::isModel(this->entityFlags()); }
155  bool isInstance() const { return smtk::model::isInstance(this->entityFlags()); }
156  bool isSessionRef() const { return smtk::model::isSessionRef(this->entityFlags()); }
157  bool isAuxiliaryGeometry() const { return smtk::model::isAuxiliaryGeometry(this->entityFlags()); }
158  bool isConcept() const { return smtk::model::isConcept(this->entityFlags()); }
159 
160  bool isVertex() const { return smtk::model::isVertex(this->entityFlags()); }
161  bool isEdge() const { return smtk::model::isEdge(this->entityFlags()); }
162  bool isFace() const { return smtk::model::isFace(this->entityFlags()); }
163  bool isVolume() const { return smtk::model::isVolume(this->entityFlags()); }
164  bool isChain() const { return smtk::model::isChain(this->entityFlags()); }
165  bool isLoop() const { return smtk::model::isLoop(this->entityFlags()); }
166  bool isShell() const { return smtk::model::isShell(this->entityFlags()); }
167  bool isVertexUse() const { return smtk::model::isVertexUse(this->entityFlags()); }
168  bool isEdgeUse() const { return smtk::model::isEdgeUse(this->entityFlags()); }
169  bool isFaceUse() const { return smtk::model::isFaceUse(this->entityFlags()); }
170  bool isVolumeUse() const { return smtk::model::isVolumeUse(this->entityFlags()); }
171 
172  // Attribute Stuff
175 
176 protected:
177  Entity();
178  int consumeInvalidIndex(const smtk::common::UUID& uid);
179  smtk::model::Resource* rawModelResource() const;
180 
181  BitFlags m_entityFlags{ INVALID };
182  smtk::common::UUIDArray m_relations;
183  smtk::model::WeakResourcePtr m_resource;
184  KindsToArrangements m_arrangements;
185  int m_firstInvalid{ -1 };
186  smtk::common::UUID m_id;
187  mutable smtk::model::Resource* m_rawResource = nullptr;
188 };
189 
191 typedef std::pair<smtk::common::UUID, Entity> UUIDEntityPair;
192 
193 } // namespace model
194 } // namespace smtk
195 
196 #endif // smtk_model_Entity_h
smtk
The main namespace for the Simulation Modeling Tool Kit (SMTK).
Definition: doc.h:33
smtk::model::Entity
A solid model entity, defined by a type and relations to other entities.
Definition: Entity.h:46
smtk::model::Resource::dimension
int dimension(const smtk::common::UUID &ofEntity) const
Return the dimension of the manifold that the passed entity represents.
Definition: Resource.cxx:687
smtk::model::Entity::referenceAs
T referenceAs() const
Return the templated object (usually EntityRef or a subclass) that points to this component.
Definition: Entity.h:78
smtk::attribute::Attributes
std::vector< smtk::attribute::AttributePtr > Attributes
Definition: PublicPointerDefs.h:464
smtk::resource::Resource::name
std::string name() const override
Return the user-assigned name of the resource.
Definition: Resource.cxx:198
smtk::model::Resource::findDualArrangements
bool findDualArrangements(const smtk::common::UUID &entityId, ArrangementKind kind, int index, ArrangementReferences &duals) const
Find the inverse of the given arrangement, if it exists.
Definition: Resource.cxx:2271
smtk::model::BitFlags
unsigned int BitFlags
The integer type used to hold bit values describing an entity's type.
Definition: EntityTypeBits.h:25
smtk::model::INVALID
@ INVALID
The entity is invalid.
Definition: EntityTypeBits.h:169
smtk::resource::Resource::index
virtual Index index() const
index is a compile-time intrinsic of the derived resource; as such, it cannot be set.
Definition: Resource.h:82
smtk::common::UUID
Definition: UUID.h:38
smtk::model::Arrangements
std::vector< smtk::model::Arrangement > Arrangements
A vector of Arrangements is associated to each Manager entity.
Definition: PublicPointerDefs.h:141
StringData.h
smtk::model::Resource::findArrangementInvolvingEntity
int findArrangementInvolvingEntity(const smtk::common::UUID &entityId, ArrangementKind kind, const smtk::common::UUID &involved) const
Find an arrangement of type kind that relates entityId to involvedEntity.
Definition: Resource.cxx:2235
smtk::model::EntityPtr
smtk::shared_ptr< smtk::model::Entity > EntityPtr
Definition: PublicPointerDefs.h:423
smtk::model::KindsToArrangements
std::map< ArrangementKind, Arrangements > KindsToArrangements
A map holding Arrangements of different ArrangementKinds.
Definition: Arrangement.h:171
smtk::model::Resource::findArrangement
const Arrangement * findArrangement(const smtk::common::UUID &entityId, ArrangementKind kind, int index) const
Retrieve arrangement information for a cell.
Definition: Resource.cxx:2194
smtk::model::Resource::clearArrangements
bool clearArrangements(const smtk::common::UUID &entityId)
Erase all arrangements for the given entityId.
Definition: Resource.cxx:2137
smtk::common::UUIDArray
std::vector< smtk::common::UUID > UUIDArray
Definition: PublicPointerDefs.h:35
smtk::model::Resource
Store information about solid models.
Definition: Resource.h:93
smtkTypeMacro
#define smtkTypeMacro(...)
Add typedefs to a class for identifcation.
Definition: SharedFromThis.h:51
smtk::model::WeakResourcePtr
smtk::weak_ptr< smtk::model::Resource > WeakResourcePtr
Definition: PublicPointerDefs.h:421
smtk::model::Entity::setId
bool setId(const common::UUID &uid) override
Assign an ID to this object (used by readers; not for arbitrary reuse).
Definition: Entity.h:144
smtk::model::ResourcePtr
smtk::shared_ptr< smtk::model::Resource > ResourcePtr
Definition: PublicPointerDefs.h:419
smtkSharedPtrCreateMacro
#define smtkSharedPtrCreateMacro(...)
A convenience macro for declaring shared_from_this and create methods.
Definition: SharedFromThis.h:207
smtk::model::Entity::id
const common::UUID & id() const override
Return a unique identifier for the object which will be persistent across sessions.
Definition: Entity.h:143
smtk::resource::Component
Component is the base class for records stored in an smtk::resource::Resource.
Definition: Component.h:43
smtk::model::UUIDEntityPair
std::pair< smtk::common::UUID, Entity > UUIDEntityPair
An abbreviation for the record type used by maps of Entity records.
Definition: Entity.h:191
smtk::model::ArrangementKind
ArrangementKind
Specification of how a cell's relations are arranged.
Definition: ArrangementKind.h:48
smtk::resource::ResourcePtr
smtk::shared_ptr< smtk::resource::Resource > ResourcePtr
Definition: PublicPointerDefs.h:295
smtk::model::ArrangementReferences
std::vector< smtk::model::ArrangementReference > ArrangementReferences
An array of ArrangementReference objects used, for instance, to enumerate inverse relations.
Definition: PublicPointerDefs.h:138
smtk::attribute::ConstDefinitionPtr
smtk::shared_ptr< const smtk::attribute::Definition > ConstDefinitionPtr
Definition: PublicPointerDefs.h:452