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; }
142 SMTK_DEPRECATED_IN_22_07(
"Replaced by Definition::categoryInheritanceMode.")
143 bool isOkToInherit() const;
144 SMTK_DEPRECATED_IN_22_07("Replaced by
Definition::setCategoryInheritanceMode.")
145 void setIsOkToInherit(
bool isOkToInheritValue);
151 Categories::CombinationMode categoryInheritanceMode()
const {
return m_combinationMode; }
165 m_localCategories = catSet;
178 void filterItemDefinitions(T& values, std::function<
bool(
typename T::value_type)> test);
189 unsigned int advanceLevel(
int mode = 0)
const;
190 void setLocalAdvanceLevel(
int mode,
unsigned int level);
191 void setLocalAdvanceLevel(
unsigned int level);
192 unsigned int localAdvanceLevel(
int mode = 0)
const
194 return (mode == 1 ? m_localAdvanceLevel[1] : m_localAdvanceLevel[0]);
199 void unsetLocalAdvanceLevel(
int mode = 0);
202 bool hasLocalAdvanceLevelInfo(
int mode = 0)
const
204 return (mode == 1 ? m_hasLocalAdvanceLevelInfo[1] : m_hasLocalAdvanceLevelInfo[0]);
209 bool isUnique()
const {
return m_isUnique; }
213 void setIsUnique(
bool isUniqueValue);
217 bool isNodal()
const {
return m_isNodal; }
218 void setIsNodal(
bool isNodalValue) { m_isNodal = isNodalValue; }
224 const double* notApplicableColor()
const;
225 void setNotApplicableColor(
double r,
double g,
double b,
double alpha);
226 void setNotApplicableColor(
const double* color)
228 this->setNotApplicableColor(color[0], color[1], color[2], color[3]);
231 void unsetNotApplicableColor() { m_isNotApplicableColorSet =
false; }
232 bool isNotApplicableColorSet()
const {
return m_isNotApplicableColorSet; }
237 const double* defaultColor()
const;
238 void setDefaultColor(
double r,
double g,
double b,
double alpha);
239 void setDefaultColor(
const double* color)
241 this->setDefaultColor(color[0], color[1], color[2], color[3]);
244 void unsetDefaultColor() { m_isDefaultColorSet =
false; }
245 bool isDefaultColorSet()
const {
return m_isDefaultColorSet; }
276 void clearLocalAssociationRule();
278 bool associatesWithVertex()
const;
279 bool associatesWithEdge()
const;
280 bool associatesWithFace()
const;
281 bool associatesWithVolume()
const;
282 bool associatesWithModel()
const;
283 bool associatesWithGroup()
const;
295 AssociationResultType canBeAssociated(
314 std::size_t numberOfItemDefinitions()
const {
return m_itemDefs.size() + m_baseItemOffset; }
318 const std::vector<smtk::attribute::ItemDefinitionPtr>& localItemDefinitions()
const
329 typename smtk::internal::shared_ptr_type<T>::SharedPointerType addItemDefinition(
330 const std::string& name)
333 typename SharedTypes::SharedPointerType item;
336 if (this->findItemPosition(name) < 0)
338 std::size_t n = m_itemDefs.size();
339 item = SharedTypes::RawPointerType::New(name);
340 m_itemDefs.push_back(item);
341 m_itemDefPositions[name] =
static_cast<int>(n);
342 this->updateDerivedDefinitions();
359 int findItemPosition(
const std::string& name)
const;
361 const std::string& detailedDescription()
const {
return m_detailedDescription; }
362 void setDetailedDescription(
const std::string& text) { m_detailedDescription = text; }
364 const std::string& briefDescription()
const {
return m_briefDescription; }
365 void setBriefDescription(
const std::string& text) { m_briefDescription = text; }
377 void setRootName(
const std::string& val) { m_rootName = val; }
378 std::string rootName()
const {
return m_rootName; }
382 void resetItemOffset();
383 std::size_t itemOffset()
const {
return m_baseItemOffset; }
388 void setIncludeIndex(std::size_t index) { m_includeIndex = index; }
390 std::size_t includeIndex()
const {
return m_includeIndex; }
396 m_exclusionDefs.insert(def);
397 def->m_exclusionDefs.insert(this->shared_from_this());
403 const WeakDefinitionSet exclusions()
const {
return m_exclusionDefs; }
406 std::vector<std::string> excludedTypeNames()
const;
411 bool isUsedAsAPrerequisite()
const;
414 const WeakDefinitionSet prerequisites()
const {
return m_prerequisiteDefs; }
417 std::vector<std::string> prerequisiteTypeNames()
const;
424 bool hasPrerequisites()
const;
430 const std::string& myType,
434 void clearResource() { m_resource.reset(); }
442 void updateDerivedDefinitions();
448 virtual void applyAdvanceLevels(
449 const unsigned int& readLevelFromParent,
450 const unsigned int& writeLevelFromParent);
458 attribute::Categories::Set m_localCategories;
459 attribute::Categories m_categories;
460 bool m_hasLocalAdvanceLevelInfo[2];
461 unsigned int m_localAdvanceLevel[2];
462 unsigned int m_advanceLevel[2];
463 WeakDefinitionSet m_exclusionDefs;
464 WeakDefinitionSet m_prerequisiteDefs;
467 std::vector<smtk::attribute::ItemDefinitionPtr> m_itemDefs;
468 std::map<std::string, int> m_itemDefPositions;
474 bool m_isNotApplicableColorSet;
475 bool m_isDefaultColorSet;
478 std::string m_detailedDescription;
479 std::string m_briefDescription;
481 std::size_t m_baseItemOffset;
482 std::string m_rootName;
484 std::size_t m_includeIndex;
489 static double s_notApplicableBaseColor[4];
490 static double s_defaultBaseColor[4];
492 double m_notApplicableColor[4];
493 double m_defaultColor[4];
496 inline void Definition::resetItemOffset()
498 if (m_baseDefinition)
500 m_baseItemOffset = m_baseDefinition->numberOfItemDefinitions();
504 inline const double* Definition::notApplicableColor()
const
506 if (m_isNotApplicableColorSet)
508 return m_notApplicableColor;
510 else if (m_baseDefinition)
512 return m_baseDefinition->notApplicableColor();
514 return s_notApplicableBaseColor;
517 inline void Definition::setNotApplicableColor(
double r,
double g,
double b,
double a)
519 m_isNotApplicableColorSet =
true;
520 m_notApplicableColor[0] = r;
521 m_notApplicableColor[1] = g;
522 m_notApplicableColor[2] = b;
523 m_notApplicableColor[3] = a;
526 inline const double* Definition::defaultColor()
const
528 if (m_isDefaultColorSet)
530 return m_defaultColor;
532 else if (m_baseDefinition)
534 return m_baseDefinition->defaultColor();
536 return s_defaultBaseColor;
539 inline void Definition::setDefaultColor(
double r,
double g,
double b,
double a)
541 m_isDefaultColorSet =
true;
542 m_defaultColor[0] = r;
543 m_defaultColor[1] = g;
544 m_defaultColor[2] = b;
545 m_defaultColor[3] = a;
551 std::function<
bool(
typename T::value_type)> test)
555 typename T::value_type testItem =
556 smtk::dynamic_pointer_cast<typename T::value_type::element_type>(item);
558 if (testItem && test(testItem))
560 filtered.insert(filtered.end(), testItem);
564 std::for_each(m_itemDefs.begin(), m_itemDefs.end(), conditionalAdd);