diff --git a/src/ifcconvert/XmlSerializer.cpp b/src/ifcconvert/XmlSerializer.cpp index ba084f5a84..702e5431f1 100644 --- a/src/ifcconvert/XmlSerializer.cpp +++ b/src/ifcconvert/XmlSerializer.cpp @@ -119,7 +119,7 @@ typename V::list::ptr get_related(T* t, F f, G g) { typename V::list::ptr acc(new typename V::list); for (typename U::list::it it = li->begin(); it != li->end(); ++it) { U* u = *it; - acc->push((*u.*g)()); + acc->push((*u.*g)()->as()); } return acc; } @@ -142,9 +142,15 @@ void descend(IfcProduct* product, ptree& tree) { } } +#ifdef USE_IFC2x3 IfcObjectDefinition::list::ptr structures = get_related (product, &IfcProduct::IsDecomposedBy, &IfcRelDecomposes::RelatedObjects); +#else + IfcObjectDefinition::list::ptr structures = get_related + + (product, &IfcProduct::IsDecomposedBy, &IfcRelAggregates::RelatedObjects); +#endif for (IfcObjectDefinition::list::it it = structures->begin(); it != structures->end(); ++it) { IfcObjectDefinition* ob = *it; @@ -172,9 +178,15 @@ template <> void descend(IfcProject* project, ptree& tree) { ptree& child = format_entity_instance(project, tree); +#ifdef USE_IFC2x3 IfcObjectDefinition::list::ptr structures = get_related (project, &IfcProject::IsDecomposedBy, &IfcRelDecomposes::RelatedObjects); +#else + IfcObjectDefinition::list::ptr structures = get_related + + (project, &IfcProduct::IsDecomposedBy, &IfcRelAggregates::RelatedObjects); +#endif for (IfcObjectDefinition::list::it it = structures->begin(); it != structures->end(); ++it) { IfcObjectDefinition* ob = *it; diff --git a/src/ifcparse/IfcUtil.cpp b/src/ifcparse/IfcUtil.cpp index ec87125610..c5fa4a0244 100644 --- a/src/ifcparse/IfcUtil.cpp +++ b/src/ifcparse/IfcUtil.cpp @@ -25,11 +25,15 @@ #include "IfcUtil.h" void IfcEntityList::push(IfcUtil::IfcBaseClass* l) { - if ( l ) ls.push_back(l); + if (l) { + ls.push_back(l); + } } void IfcEntityList::push(const IfcEntityList::ptr& l) { - for( it i = l->begin(); i != l->end(); ++i ) { - if ( *i ) ls.push_back(*i); + if (l) { + for( it i = l->begin(); i != l->end(); ++i ) { + if ( *i ) ls.push_back(*i); + } } } unsigned int IfcEntityList::size() const { return (unsigned int) ls.size(); } diff --git a/src/ifcparse/IfcUtil.h b/src/ifcparse/IfcUtil.h index b811a680a7..565f19f439 100644 --- a/src/ifcparse/IfcUtil.h +++ b/src/ifcparse/IfcUtil.h @@ -80,6 +80,13 @@ namespace IfcUtil { virtual IfcSchema::Type::Enum getArgumentEntity(unsigned int i) const = 0; virtual Argument* getArgument(unsigned int i) const = 0; virtual const char* getArgumentName(unsigned int i) const = 0; + + template + typename T* as() { + return is(T::Class()) + ? static_cast(this) + : static_cast(0); + } }; class IfcBaseEntity : public IfcBaseClass { @@ -127,8 +134,8 @@ class IfcTemplatedEntityList { public: typedef SHARED_PTR< IfcTemplatedEntityList > ptr; typedef typename std::vector::const_iterator it; - void push(T* t) {if (t) ls.push_back(t);} - void push(ptr t) { for ( typename T::list::it it = t->begin(); it != t->end(); ++it ) push(*it); } + void push(T* t) { if (t) { ls.push_back(t); } } + void push(ptr t) { if (t) { for ( typename T::list::it it = t->begin(); it != t->end(); ++it ) push(*it); } } it begin() { return ls.begin(); } it end() { return ls.end(); } unsigned int size() const { return (unsigned int) ls.size(); } @@ -162,15 +169,17 @@ public: typedef SHARED_PTR< IfcEntityListList > ptr; typedef std::vector< std::vector >::const_iterator outer_it; typedef std::vector::const_iterator inner_it; - void push(const std::vector& l) { + void push(const std::vector& l) { ls.push_back(l); } void push(const IfcEntityList::ptr& l) { - std::vector li; - for (std::vector::const_iterator jt = l->begin(); jt != l->end(); ++jt) { - li.push_back(*jt); - } - push(li); + if (l) { + std::vector li; + for (std::vector::const_iterator jt = l->begin(); jt != l->end(); ++jt) { + li.push_back(*jt); + } + push(li); + } } outer_it begin() const { return ls.begin(); } outer_it end() const { return ls.end(); }