31 return owner !=
nullptr;
36 return owner !=
nullptr;
53 if (instanceID.empty())
59 path.AddElement(instanceID);
62 if (!propName.empty())
64 path.AddElement(propName);
74 std::vector<std::string> keys;
77 auto sourceData = sourceCasted->
GetData();
79 keys = sourceData->GetPropertyKeys();
82 keys = sourceCasted->GetPropertyKeys();
97 mitkThrow() <<
"Error. Passed owner pointer is NULL";
100 std::vector<std::string> keys;
106 auto regEx = std::regex(sourceRegExStr);
108 for (
const auto &key : keys)
110 if (std::regex_match(key, regEx))
113 auto ruleID = idProp->GetValueAsString();
129 mitkThrow() <<
"Error. Passed source pointer is NULL";
133 mitkThrow() <<
"Error. Passed owner pointer is NULL";
147 if (instanceIDs_data.size() > 1)
149 MITK_WARN <<
"Property relation on data level is ambiguous. First relation is used. Instance ID: " 150 << instanceIDs_data.front();
153 if (!instanceIDs_data.empty() && instanceIDs_data.front() !=
NULL_INSTANCE_ID())
175 mitkThrow() <<
"Error. Passed source pointer is NULL";
179 auto regEx = std::regex(ruleIDRegExStr);
187 for (
const auto &key : keys)
189 if (std::regex_match(key, regEx))
192 auto ruleID = idProp->GetValueAsString();
209 mitkThrow() <<
"Error. Passed source pointer is NULL";
213 mitkThrow() <<
"Error. Passed destination pointer is NULL";
219 for (
const auto instanceID : instanceIDs)
228 for (
const auto instanceID : instanceIDs_data)
230 if (std::find(std::begin(instanceIDs), std::end(instanceIDs), instanceID) == std::end(instanceIDs))
249 else if(result.size()>1)
251 mitkThrow() <<
"Cannot return one(!) relation UID. Multiple relations exists for given rule, source and destination.";
259 return std::string();
272 if (idProp.IsNotNull())
274 result = idProp->GetValueAsString();
291 mitkThrow() <<
"Error. Passed source pointer is NULL";
298 auto regEx = std::regex(destRegExStr);
299 std::smatch instance_matches;
305 for (
const auto &key : keys)
307 if (std::regex_search(key, instance_matches, regEx))
310 if (idProp->GetValueAsString() == relationUID)
312 if (instance_matches.size()>1)
314 result = instance_matches[1];
329 mitkThrow() <<
"Error. Passed source pointer is NULL";
333 mitkThrow() <<
"Error. Passed destination pointer is NULL";
336 auto identifiable =
dynamic_cast<const Identifiable *
>(destination);
341 auto node =
dynamic_cast<const DataNode*
>(destination);
342 if (node && node->GetData())
344 identifiable =
dynamic_cast<const Identifiable *
>(node->GetData());
354 auto regEx = std::regex(destRegExStr);
355 std::smatch instance_matches;
357 auto destUID = identifiable->GetUID();
363 for (
const auto &key : keys)
365 if (std::regex_search(key, instance_matches, regEx))
368 if (idProp->GetValueAsString() == destUID)
370 if (instance_matches.size()>1)
372 auto instanceID = instance_matches[1];
375 result.push_back(instanceID);
390 mitkThrow() <<
"Error. Passed source pointer is NULL";
394 mitkThrow() <<
"Error. Passed destination pointer is NULL";
398 mitkThrow() <<
"Error. This is an abstract property relation rule. Abstract rule must not make a connection. Please use a concrete rule.";
402 bool hasIDlayer = !instanceIDs.empty();
405 if (instanceIDs_data.size() > 1)
407 MITK_WARN <<
"Property relation on data level is ambiguous. First relation is used. Instance ID: " 408 << instanceIDs_data.front();
410 bool hasDatalayer = !instanceIDs_data.empty();
412 if (hasIDlayer && hasDatalayer && instanceIDs.front() != instanceIDs_data.front())
414 mitkThrow() <<
"Property relation information is in an invalid state. ID and data layer point to different " 415 "relation instances. Rule: " 416 << this->
GetRuleID() <<
"; ID based instance: " << instanceIDs.front()
417 <<
"; Data base instance: " << instanceIDs_data.front();
426 instanceID = instanceIDs.front();
428 else if (hasDatalayer)
430 instanceID = instanceIDs_data.front();
434 instanceID = this->CreateNewRelationInstance(source, relationUID);
447 auto identifiable =
dynamic_cast<const Identifiable *
>(destination);
452 auto node =
dynamic_cast<const DataNode*
>(destination);
453 if (node && node->GetData())
455 identifiable =
dynamic_cast<const Identifiable *
>(node->GetData());
480 for (
const auto relUID: relationUIDs)
506 for (
const auto &key : keys)
508 if (key.find(instancePrefix) == 0)
519 return generator.
GetUID();
536 std::vector<int> instanceIDs;
541 auto regEx = std::regex(destRegExStr);
542 std::smatch instance_matches;
549 for (
const auto &key : keys)
551 if (std::regex_search(key, instance_matches, regEx))
553 if (instance_matches.size()>1)
555 instanceIDs.push_back(std::stoi(instance_matches[1]));
563 std::sort(instanceIDs.begin(), instanceIDs.end());
564 if (!instanceIDs.empty())
566 newID = std::to_string(instanceIDs.back() + 1);
580 return Superclass::InternalClone();
589 if (proppath.GetSize() < 3 || !(proppath.GetFirstNode() == ref.GetFirstNode()) || !(proppath.GetNode(1) == ref.GetNode(1)))
591 mitkThrow() <<
"Property name is not for a RII property or containes no instance ID. Wrong name: " << propName;
594 return proppath.GetNode(2).name;
602 mitkThrow() <<
"Error. Source is invalid. Cannot deduce rule ID";
612 if (prop.IsNotNull())
614 result = prop->GetValueAsString();
635 using FunctionType = std::function<bool(const mitk::IPropertyProvider *, const mitk::PropertyRelationRuleBase *)>;
640 ~NodePredicateRuleFunction()
override =
default;
649 return m_Function(node, m_Rule);
657 FunctionType m_Function;
666 return rule->IsSourceCandidate(node);
669 return NodePredicateRuleFunction::New(check,
this).GetPointer();
675 return rule->IsDestinationCandidate(node);
678 return NodePredicateRuleFunction::New(check,
this).GetPointer();
685 return rule->IsSource(node);
688 return NodePredicateRuleFunction::New(check,
this).GetPointer();
696 mitkThrow() <<
"Error. Passed destination pointer is NULL";
701 return rule->HasRelation(node, destination) >= minimalRelation;
704 return NodePredicateRuleFunction::New(check,
this).GetPointer();
712 mitkThrow() <<
"Error. Passed source pointer is NULL";
717 return rule->HasRelation(source, node) >= minimalRelation;
720 return NodePredicateRuleFunction::New(check,
this).GetPointer();
728 mitkThrow() <<
"Error. Passed source pointer is NULL";
732 if (std::find(relUIDs.begin(), relUIDs.end(), relationUID) == relUIDs.end())
735 <<
"Error. Passed relationUID does not identify a relation instance of the passed source for this rule instance.";
741 auto relevantUIDs = rule->GetRelationUIDs(source, node);
742 for (
const auto& aUID : relevantUIDs)
744 if (aUID == relationUID)
757 return NodePredicateRuleFunction::New(check,
this).GetPointer();
virtual RuleIDType GetRuleID() const =0
NodePredicateBase::ConstPointer GetSourceCandidateIndicator() const
std::mutex relationCreationLock
MITKCORE_EXPORT std::string PropertyKeyPathToPropertyName(const PropertyKeyPath &tagPath)
NodePredicateBase::ConstPointer GetConnectedSourcesDetector() const
std::string InstanceIDType
virtual void Disconnect_datalayer(IPropertyOwner *source, const InstanceIDType &instanceID) const =0
NodePredicateBase::ConstPointer GetDestinationCandidateIndicator() const
RelationUIDType GetRelationUID(const IPropertyProvider *source, const IPropertyProvider *destination) const
static InstanceIDType NULL_INSTANCE_ID()
virtual bool IsSupportedRuleID(const RuleIDType &ruleID) const
virtual InstanceIDVectorType GetInstanceID_datalayer(const IPropertyProvider *source, const IPropertyProvider *destination) const =0
DataCollection - Class to facilitate loading/accessing structured data.
PropertyKeyPath & AddElement(const ElementNameType &name)
InstanceIDVectorType GetInstanceID_IDLayer(const IPropertyProvider *source, const IPropertyProvider *destination) const
NodePredicateBase::ConstPointer GetDestinationDetector(const IPropertyProvider *source, RelationUIDType relationUID) const
virtual BaseProperty::ConstPointer GetConstProperty(const std::string &propertyKey, const std::string &contextName="", bool fallBackOnDefaultContext=true) const =0
Get property by its key.
#define mitkNewMacro2Param(classname, typea, typeb)
RelationUIDType Connect(IPropertyOwner *source, const IPropertyProvider *destination) const
std::string GetRIIPropertyRegEx(const std::string propName="", const InstanceIDType &instanceID="") const
virtual void Connect_datalayer(IPropertyOwner *source, const IPropertyProvider *destination, const InstanceIDType &instanceID) const =0
RelationUIDType GetRelationUIDByInstanceID(const IPropertyProvider *source, const InstanceIDType &instanceID) const
InstanceIDType GetInstanceIDByRelationUID(const IPropertyProvider *source, const RelationUIDType &relationUID) const
RelationUIDVectorType GetExistingRelations(const IPropertyProvider *source) const
BaseData * GetData() const
Get the data object (instance of BaseData, e.g., an Image) managed by this DataNode.
static PropertyKeyPath GetRootKeyPath()
virtual void RemoveProperty(const std::string &propertyKey, const std::string &contextName="", bool fallBackOnDefaultContext=false)=0
Removes a property. If the property does not exist, nothing will be done.
virtual std::vector< std::string > GetPropertyKeys(const std::string &contextName="", bool includeDefaultContext=false) const =0
Query keys of existing properties.
Identifiable::UIDType RelationUIDType
#define mitkClassMacro(className, SuperClassName)
MITKCORE_EXPORT PropertyKeyPath PropertyNameToPropertyKeyPath(const std::string &propertyName)
void Disconnect(IPropertyOwner *source, const IPropertyProvider *destination) const
static std::vector< std::string > GetPropertyKeys(const mitk::IPropertyProvider *owner)
NodePredicateBase::ConstPointer GetDestinationsDetector(const IPropertyProvider *source, RelationType minimalRelation=RelationType::Implicit_Data) const
std::vector< RelationUIDType > RelationUIDVectorType
#define mitkThrowException(classname)
virtual bool HasImplicitDataRelation(const IPropertyProvider *source, const IPropertyProvider *destination) const =0
itk::LightObject::Pointer InternalClone() const override
virtual bool IsSourceCandidate(const IPropertyProvider *owner) const
virtual bool IsAbstract() const
static InstanceIDType GetInstanceIDByPropertyName(const std::string propName)
RuleIDType GetRuleIDByInstanceID(const IPropertyProvider *source, const InstanceIDType &instanceID) const
Interface for evaluation conditions used in the DataStorage class GetSubset() method.
std::vector< InstanceIDType > InstanceIDVectorType
RelationType HasRelation(const IPropertyProvider *source, const IPropertyProvider *destination) const
NodePredicateBase::ConstPointer GetSourcesDetector(const IPropertyProvider *destination, RelationType minimalRelation=RelationType::Implicit_Data) const
Class that can be used to specify nested or wild carded property keys. E.g. for the use in context of...
Base class of identifiable objects.
MITKCORE_EXPORT std::string PropertyKeyPathToPropertyRegEx(const PropertyKeyPath &tagPath)
Class for nodes of the DataTree.
bool IsSource(const IPropertyProvider *owner) const
virtual void SetProperty(const std::string &propertyKey, BaseProperty *property, const std::string &contextName="", bool fallBackOnDefaultContext=false)=0
Add new or change existent property.
RelationUIDVectorType GetRelationUIDs(const IPropertyProvider *source, const IPropertyProvider *destination) const
virtual bool IsDestinationCandidate(const IPropertyProvider *owner) const