From 8f853ac5afdb78fc7c43b52ee15a1c925787c46a Mon Sep 17 00:00:00 2001 From: Thomas Krijnen Date: Thu, 19 Feb 2015 20:20:47 +0000 Subject: [PATCH] Initialize the attributes of IfcLateBoundEntity to NULL upon construction. Make sure IfcWritableEntity does not return null pointers, since getArgumentCount() is unreliable for instances being created from keyword arguments in Python. --- src/ifcparse/IfcLateBoundEntity.cpp | 4 ++++ src/ifcparse/IfcWrite.cpp | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ifcparse/IfcLateBoundEntity.cpp b/src/ifcparse/IfcLateBoundEntity.cpp index 47a31fc1e5..7b3e9193d6 100644 --- a/src/ifcparse/IfcLateBoundEntity.cpp +++ b/src/ifcparse/IfcLateBoundEntity.cpp @@ -48,6 +48,10 @@ IfcParse::IfcLateBoundEntity::IfcLateBoundEntity(const std::string& s) { for (std::string::iterator i = S.begin(); i != S.end(); ++i ) *i = toupper(*i); _type = IfcSchema::Type::FromString(S); entity = new IfcWrite::IfcWritableEntity(_type); + for (unsigned i = 0; i < getArgumentCount(); ++i) { + // Side effect of this is that a NULL attribute is created. + entity->getArgument(i); + } IfcSchema::Type::PopulateDerivedFields(writable_entity()); } IfcParse::IfcLateBoundEntity::IfcLateBoundEntity(IfcAbstractEntity* e) { diff --git a/src/ifcparse/IfcWrite.cpp b/src/ifcparse/IfcWrite.cpp index 4be7e096ad..f0b95e1fc9 100644 --- a/src/ifcparse/IfcWrite.cpp +++ b/src/ifcparse/IfcWrite.cpp @@ -71,7 +71,12 @@ IfcEntityList::ptr IfcWritableEntity::getInverse(IfcSchema::Type::Enum type, int } std::string IfcWritableEntity::datatype() const { return IfcSchema::Type::ToString(_type); } -Argument* IfcWritableEntity::getArgument (unsigned int i) { if ( i >= getArgumentCount() ) throw IfcParse::IfcException("Argument not set"); return args[i]; } +Argument* IfcWritableEntity::getArgument (unsigned int i) { + if (args[i] == 0) { + _setArgument(i, boost::none); + } + return args[i]; +} unsigned int IfcWritableEntity::getArgumentCount() const {return args.size(); } IfcSchema::Type::Enum IfcWritableEntity::type() const { return _type; } bool IfcWritableEntity::is(IfcSchema::Type::Enum v) const { return _type == v; }