Experimental get_inverse_cardinality proposal. See #1904.

This commit is contained in:
Dion Moult
2021-11-30 13:25:02 +11:00
committed by Thomas Krijnen
parent d1caa3242f
commit cef1c86f6d
4 changed files with 33 additions and 0 deletions
@@ -391,6 +391,16 @@ class file(object):
return inverses
return set(inverses)
def get_inverse_cardinality(self, inst):
"""Returns the number of entities that reference this entity
:param inst: The entity instance to get inverse relationships
:type inst: ifcopenshell.entity_instance.entity_instance
:returns: 0 if no references, 1 if one reference, or 2 if more than one reference
:rtype: int
"""
return self.wrapped_data.get_inverse_cardinality(inst.wrapped_data)
def remove(self, inst):
"""Deletes an IFC object in the file.
+1
View File
@@ -249,6 +249,7 @@ public:
aggregate_of_instance::ptr traverse_breadth_first(IfcUtil::IfcBaseClass* instance, int max_level=-1);
aggregate_of_instance::ptr getInverse(int instance_id, const IfcParse::declaration* type, int attribute_index);
int getInverseCardinality(int instance_id);
template <class T>
typename T::list::ptr getInverse(int instance_id, int attribute_index) {
+19
View File
@@ -2387,6 +2387,25 @@ aggregate_of_instance::ptr IfcFile::getInverse(int instance_id, const IfcParse::
return return_value;
}
int IfcFile::getInverseCardinality(int instance_id) {
auto lower = byref_excl.lower_bound({ instance_id,-1,-1 });
auto upper = byref_excl.upper_bound({ instance_id, std::numeric_limits<int>::max(), std::numeric_limits<int>::max() });
int total_references = 0;
for (auto it = lower; it != upper; it++) {
for (auto& i : it->second) {
total_references++;
if (total_references > 1) {
return total_references;
}
}
}
return total_references;
}
void IfcFile::setDefaultHeaderValues() {
const std::string empty_string = "";
std::vector<std::string> file_description, schema_identifiers, empty_vector;
+3
View File
@@ -88,6 +88,9 @@ static IfcUtil::ArgumentType helper_fn_attribute_type(const IfcUtil::IfcBaseClas
aggregate_of_instance::ptr get_inverse(IfcUtil::IfcBaseClass* e) {
return $self->getInverse(e->data().id(), 0, -1);
}
int get_inverse_cardinality(IfcUtil::IfcBaseClass* e) {
return $self->getInverseCardinality(e->data().id());
}
void write(const std::string& fn) {
std::ofstream f(IfcUtil::path::from_utf8(fn).c_str());