diff --git a/src/ifcparse/IfcBaseClass.h b/src/ifcparse/IfcBaseClass.h index 3caa6534fd..11ea7d95ba 100644 --- a/src/ifcparse/IfcBaseClass.h +++ b/src/ifcparse/IfcBaseClass.h @@ -24,8 +24,12 @@ #include "../ifcparse/IfcEntityInstanceData.h" #include "../ifcparse/IfcSchema.h" +#include "../ifcparse/utils.h" + +#include class Argument; +class IfcEntityList; namespace IfcUtil { @@ -78,6 +82,8 @@ namespace IfcUtil { virtual const IfcParse::entity& declaration() const = 0; Argument* get(const std::string& name) const; + + boost::shared_ptr get_inverse(const std::string& a) const; }; // TODO: Investigate whether these should be template classes instead diff --git a/src/ifcparse/IfcUtil.cpp b/src/ifcparse/IfcUtil.cpp index 41784a776e..0b5cff9aed 100644 --- a/src/ifcparse/IfcUtil.cpp +++ b/src/ifcparse/IfcUtil.cpp @@ -205,6 +205,19 @@ Argument* IfcUtil::IfcBaseEntity::get(const std::string& name) const { return data().getArgument(declaration().attribute_index(name)); } +IfcEntityList::ptr IfcUtil::IfcBaseEntity::get_inverse(const std::string& name) const { + const std::vector attrs = declaration().as_entity()->all_inverse_attributes(); + std::vector::const_iterator it = attrs.begin(); + for (; it != attrs.end(); ++it) { + if ((*it)->name() == name) { + return data().getInverse( + (*it)->entity_reference(), + (*it)->entity_reference()->attribute_index((*it)->attribute_reference())); + } + } + throw IfcParse::IfcException(name + " not found on " + declaration().name()); +} + void IfcUtil::IfcBaseClass::data(IfcEntityInstanceData* d) { delete data_; data_ = d; diff --git a/src/ifcwrap/IfcParseWrapper.i b/src/ifcwrap/IfcParseWrapper.i index 1a9153f5a3..46b835a8a1 100644 --- a/src/ifcwrap/IfcParseWrapper.i +++ b/src/ifcwrap/IfcParseWrapper.i @@ -266,16 +266,11 @@ static IfcUtil::ArgumentType helper_fn_attribute_type(const IfcUtil::IfcBaseClas } IfcEntityList::ptr get_inverse(const std::string& a) { - const std::vector attrs = $self->declaration().as_entity()->all_inverse_attributes(); - std::vector::const_iterator it = attrs.begin(); - for (; it != attrs.end(); ++it) { - if ((*it)->name() == a) { - return self->data().getInverse( - (*it)->entity_reference(), - (*it)->entity_reference()->attribute_index((*it)->attribute_reference())); - } + if ($self->declaration().as_entity()) { + return ((IfcUtil::IfcBaseEntity*)$self)->get_inverse(a); + } else { + throw IfcParse::IfcException(a + " not found on " + $self->declaration().name()); } - throw IfcParse::IfcException(a + " not found on " + $self->declaration().name()); } const char* const get_argument_type(unsigned int i) const {