From 1a4d750ecdd032a7feebb9473f53c282dc7dac2e Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Wed, 14 Jan 2026 14:00:50 +0100 Subject: [PATCH] Consistency of get_inverse calls --- src/ifcopenshell-python/ifcopenshell/file.py | 4 ++-- src/ifcparse/IfcParse.cpp | 10 ++++---- src/ifcwrap/IfcParseWrapper.i | 25 ++++---------------- 3 files changed, 12 insertions(+), 27 deletions(-) diff --git a/src/ifcopenshell-python/ifcopenshell/file.py b/src/ifcopenshell-python/ifcopenshell/file.py index a3e87e1acb..5e3d751c41 100644 --- a/src/ifcopenshell-python/ifcopenshell/file.py +++ b/src/ifcopenshell-python/ifcopenshell/file.py @@ -806,11 +806,11 @@ class file_mixin: if with_attribute_indices and not allow_duplicate: raise ValueError("with_attribute_indices requires allow_duplicate to be True") - inverses = self.get_inverse(inst) + inverses = self._get_inverse(inst) if allow_duplicate: if with_attribute_indices: - idxs = self.get_inverse_indices(inst) + idxs = self._get_inverse_indices(inst) # TODO: include in typing. return list(zip(inverses, idxs)) else: diff --git a/src/ifcparse/IfcParse.cpp b/src/ifcparse/IfcParse.cpp index aca36af03d..d14b457a8a 100644 --- a/src/ifcparse/IfcParse.cpp +++ b/src/ifcparse/IfcParse.cpp @@ -2489,22 +2489,24 @@ std::vector IfcFile::getInverse(int instance_id, const IfcParse } size_t IfcFile::getTotalInverses(int instance_id) { - size_t n = 0; + std::set counted_ids; - std::visit([&n, instance_id](const auto& x) { + std::visit([&counted_ids, instance_id](const auto& x) { if constexpr (std::is_same_v, std::monostate>) { } else if constexpr (std::is_same_v, impl::in_memory_file_storage>) { auto lower = x.byref_excl_.lower_bound({ instance_id, -1, -1 }); auto upper = x.byref_excl_.upper_bound({ instance_id, std::numeric_limits::max(), std::numeric_limits::max() }); for (auto it = lower; it != upper; ++it) { - n += it->second.size(); + for (auto& i : it->second) { + counted_ids.insert(i); + } } } else if constexpr (std::is_same_v, impl::rocks_db_file_storage>) { // @todo } }, storage_); - return n; + return counted_ids.size(); } void IfcFile::setDefaultHeaderValues() { diff --git a/src/ifcwrap/IfcParseWrapper.i b/src/ifcwrap/IfcParseWrapper.i index d2b27bec31..39d3e22c65 100644 --- a/src/ifcwrap/IfcParseWrapper.i +++ b/src/ifcwrap/IfcParseWrapper.i @@ -199,35 +199,18 @@ private: } */ - IfcFile(const std::string& schema = "IFC4") { - auto resolved_schema = schema; - if (resolved_schema == "IFC4X3") { - resolved_schema = "IFC4X3_ADD2"; - } - return new IfcParse::IfcFile(IfcParse::schema_by_name(resolved_schema)); + IfcFile(const std::string& schema) { + return new IfcParse::IfcFile(IfcParse::schema_by_name(schema)); } - IfcFile(const std::vector& schema_version) { - static const char* prefixes[] = { "IFC", "X", "_ADD", "_TC" }; - - std::string resolved_schema; - for (size_t i = 0; i < schema_version.size() && i < 4; ++i) { - if (schema_version[i] != 0) { - resolved_schema += prefixes[i]; - resolved_schema += std::to_string(schema_version[i]); - } - } - return new IfcParse::IfcFile(IfcParse::schema_by_name(resolved_schema)); - } - - std::vector get_inverse(const express::Base& e) { + std::vector _get_inverse(const express::Base& e) { if (auto e_ = e.as()) { return cast_vector($self->getInverse(e_.id(), 0, -1)); } throw IfcParse::IfcException("Only entities with ids are supported for get_inverse. Provided entity: '" + e.declaration().name() + "'."); } - std::vector get_inverse_indices(const express::Base& e) { + std::vector _get_inverse_indices(const express::Base& e) { if (auto e_ = e.as()) { return $self->get_inverse_indices(e_.id()); }