17 #ifndef smtk_attribute_Definition_h
18 #define smtk_attribute_Definition_h
20 #include "smtk/CoreExports.h"
24 #include "smtk/attribute/Categories.h"
25 #include "smtk/attribute/ReferenceItemDefinition.h"
26 #include "smtk/attribute/Tag.h"
29 #include "smtk/model/EntityTypeBits.h"
45 class SMTKCORE_EXPORT
Definition :
public smtk::enable_shared_from_this<Definition>
64 auto left = lhs.lock();
67 auto right = rhs.lock();
70 return left->type() < right->type();
74 typedef std::set<WeakDefinitionPtr, WeakDefinitionPtrCompare> WeakDefinitionSet;
80 const std::string& type()
const {
return m_type; }
85 const Tags&
tags()
const {
return m_tags; }
90 const Tag* tag(
const std::string& name)
const;
91 Tag* tag(
const std::string& name);
96 bool addTag(
const Tag& tag);
97 bool removeTag(
const std::string& name);
101 const std::string& displayedTypeName()
const {
return m_label.empty() ? m_type : m_label; }
106 const std::string& label()
const {
return m_label; }
108 void setLabel(
const std::string& newLabel) { m_label = newLabel; }
122 bool includeCategories =
true,
123 bool includeReadAccess =
false,
124 unsigned int readAccessLevel = 0)
const;
126 int version()
const {
return m_version; }
127 void setVersion(
int myVersion) { m_version = myVersion; }
129 bool isAbstract()
const {
return m_isAbstract; }
131 void setIsAbstract(
bool isAbstractValue) { m_isAbstract = isAbstractValue; }
156 m_localCategories = catSet;
169 void filterItemDefinitions(T& values, std::function<
bool(
typename T::value_type)> test);
180 unsigned int advanceLevel(
int mode = 0)
const;
181 void setLocalAdvanceLevel(
int mode,
unsigned int level);
182 void setLocalAdvanceLevel(
unsigned int level);
183 unsigned int localAdvanceLevel(
int mode = 0)
const
185 return (mode == 1 ? m_localAdvanceLevel[1] : m_localAdvanceLevel[0]);
190 void unsetLocalAdvanceLevel(
int mode = 0);
193 bool hasLocalAdvanceLevelInfo(
int mode = 0)
const
195 return (mode == 1 ? m_hasLocalAdvanceLevelInfo[1] : m_hasLocalAdvanceLevelInfo[0]);
200 bool isUnique()
const {
return m_isUnique; }
204 void setIsUnique(
bool isUniqueValue);
208 bool isNodal()
const {
return m_isNodal; }
209 void setIsNodal(
bool isNodalValue) { m_isNodal = isNodalValue; }
215 const double* notApplicableColor()
const;
216 void setNotApplicableColor(
double r,
double g,
double b,
double alpha);
217 void setNotApplicableColor(
const double* color)
219 this->setNotApplicableColor(color[0], color[1], color[2], color[3]);
222 void unsetNotApplicableColor() { m_isNotApplicableColorSet =
false; }
223 bool isNotApplicableColorSet()
const {
return m_isNotApplicableColorSet; }
228 const double* defaultColor()
const;
229 void setDefaultColor(
double r,
double g,
double b,
double alpha);
230 void setDefaultColor(
const double* color)
232 this->setDefaultColor(color[0], color[1], color[2], color[3]);
235 void unsetDefaultColor() { m_isDefaultColorSet =
false; }
236 bool isDefaultColorSet()
const {
return m_isDefaultColorSet; }
267 void clearLocalAssociationRule();
269 bool associatesWithVertex()
const;
270 bool associatesWithEdge()
const;
271 bool associatesWithFace()
const;
272 bool associatesWithVolume()
const;
273 bool associatesWithModel()
const;
274 bool associatesWithGroup()
const;
286 AssociationResultType canBeAssociated(
305 std::size_t numberOfItemDefinitions()
const {
return m_itemDefs.size() + m_baseItemOffset; }
309 const std::vector<smtk::attribute::ItemDefinitionPtr>& localItemDefinitions()
const
320 typename smtk::internal::shared_ptr_type<T>::SharedPointerType addItemDefinition(
321 const std::string& name)
324 typename SharedTypes::SharedPointerType item;
327 if (this->findItemPosition(name) < 0)
329 std::size_t n = m_itemDefs.size();
330 item = SharedTypes::RawPointerType::New(name);
331 m_itemDefs.push_back(item);
332 m_itemDefPositions[name] =
static_cast<int>(n);
333 this->updateDerivedDefinitions();
350 int findItemPosition(
const std::string& name)
const;
352 const std::string& detailedDescription()
const {
return m_detailedDescription; }
353 void setDetailedDescription(
const std::string& text) { m_detailedDescription = text; }
355 const std::string& briefDescription()
const {
return m_briefDescription; }
356 void setBriefDescription(
const std::string& text) { m_briefDescription = text; }
368 void setRootName(
const std::string& val) { m_rootName = val; }
369 std::string rootName()
const {
return m_rootName; }
373 void resetItemOffset();
374 std::size_t itemOffset()
const {
return m_baseItemOffset; }
379 void setIncludeIndex(std::size_t index) { m_includeIndex = index; }
381 std::size_t includeIndex()
const {
return m_includeIndex; }
387 m_exclusionDefs.insert(def);
388 def->m_exclusionDefs.insert(this->shared_from_this());
394 const WeakDefinitionSet exclusions()
const {
return m_exclusionDefs; }
397 std::vector<std::string> excludedTypeNames()
const;
402 bool isUsedAsAPrerequisite()
const;
405 const WeakDefinitionSet prerequisites()
const {
return m_prerequisiteDefs; }
408 std::vector<std::string> prerequisiteTypeNames()
const;
415 bool hasPrerequisites()
const;
421 const std::string& myType,
425 void clearResource() { m_resource.reset(); }
433 void updateDerivedDefinitions();
439 virtual void applyAdvanceLevels(
440 const unsigned int& readLevelFromParent,
441 const unsigned int& writeLevelFromParent);
449 attribute::Categories::Set m_localCategories;
450 attribute::Categories m_categories;
451 bool m_hasLocalAdvanceLevelInfo[2];
452 unsigned int m_localAdvanceLevel[2];
453 unsigned int m_advanceLevel[2];
454 WeakDefinitionSet m_exclusionDefs;
455 WeakDefinitionSet m_prerequisiteDefs;
458 std::vector<smtk::attribute::ItemDefinitionPtr> m_itemDefs;
459 std::map<std::string, int> m_itemDefPositions;
465 bool m_isNotApplicableColorSet;
466 bool m_isDefaultColorSet;
469 std::string m_detailedDescription;
470 std::string m_briefDescription;
472 std::size_t m_baseItemOffset;
473 std::string m_rootName;
475 std::size_t m_includeIndex;
480 static double s_notApplicableBaseColor[4];
481 static double s_defaultBaseColor[4];
483 double m_notApplicableColor[4];
484 double m_defaultColor[4];
487 inline void Definition::resetItemOffset()
489 if (m_baseDefinition)
491 m_baseItemOffset = m_baseDefinition->numberOfItemDefinitions();
495 inline const double* Definition::notApplicableColor()
const
497 if (m_isNotApplicableColorSet)
499 return m_notApplicableColor;
501 else if (m_baseDefinition)
503 return m_baseDefinition->notApplicableColor();
505 return s_notApplicableBaseColor;
508 inline void Definition::setNotApplicableColor(
double r,
double g,
double b,
double a)
510 m_isNotApplicableColorSet =
true;
511 m_notApplicableColor[0] = r;
512 m_notApplicableColor[1] = g;
513 m_notApplicableColor[2] = b;
514 m_notApplicableColor[3] = a;
517 inline const double* Definition::defaultColor()
const
519 if (m_isDefaultColorSet)
521 return m_defaultColor;
523 else if (m_baseDefinition)
525 return m_baseDefinition->defaultColor();
527 return s_defaultBaseColor;
530 inline void Definition::setDefaultColor(
double r,
double g,
double b,
double a)
532 m_isDefaultColorSet =
true;
533 m_defaultColor[0] = r;
534 m_defaultColor[1] = g;
535 m_defaultColor[2] = b;
536 m_defaultColor[3] = a;
542 std::function<
bool(
typename T::value_type)> test)
546 typename T::value_type testItem =
547 smtk::dynamic_pointer_cast<typename T::value_type::element_type>(item);
549 if (testItem && test(testItem))
551 filtered.insert(filtered.end(), testItem);
555 std::for_each(m_itemDefs.begin(), m_itemDefs.end(), conditionalAdd);