Type hint from schema when encountering empty aggregate. Fixes #127

This commit is contained in:
Thomas Krijnen
2016-11-08 17:24:08 +01:00
parent 00215867c0
commit e8ae491dc3
5 changed files with 160 additions and 144 deletions
+6 -1
View File
@@ -662,7 +662,10 @@ void ArgumentList::read(IfcSpfLexer* t, std::vector<unsigned int>& ids) {
} }
IfcUtil::ArgumentType ArgumentList::type() const { IfcUtil::ArgumentType ArgumentList::type() const {
if (list.empty()) return IfcUtil::Argument_UNKNOWN; if (list.empty()) {
return IfcUtil::Argument_EMPTY_AGGREGATE;
}
const IfcUtil::ArgumentType elem_type = list[0]->type(); const IfcUtil::ArgumentType elem_type = list[0]->type();
if (elem_type == IfcUtil::Argument_INT) { if (elem_type == IfcUtil::Argument_INT) {
return IfcUtil::Argument_AGGREGATE_OF_INT; return IfcUtil::Argument_AGGREGATE_OF_INT;
@@ -680,6 +683,8 @@ IfcUtil::ArgumentType ArgumentList::type() const {
return IfcUtil::Argument_AGGREGATE_OF_AGGREGATE_OF_DOUBLE; return IfcUtil::Argument_AGGREGATE_OF_AGGREGATE_OF_DOUBLE;
} else if (elem_type == IfcUtil::Argument_AGGREGATE_OF_ENTITY_INSTANCE) { } else if (elem_type == IfcUtil::Argument_AGGREGATE_OF_ENTITY_INSTANCE) {
return IfcUtil::Argument_AGGREGATE_OF_AGGREGATE_OF_ENTITY_INSTANCE; return IfcUtil::Argument_AGGREGATE_OF_AGGREGATE_OF_ENTITY_INSTANCE;
} else if (elem_type == IfcUtil::Argument_EMPTY_AGGREGATE) {
return IfcUtil::Argument_AGGREGATE_OF_EMPTY_AGGREGATE;
} else { } else {
return IfcUtil::Argument_UNKNOWN; return IfcUtil::Argument_UNKNOWN;
} }
+2
View File
@@ -105,12 +105,14 @@ static const char* const argument_type_string[] = {
"ENUMERATION", "ENUMERATION",
"ENTITY INSTANCE", "ENTITY INSTANCE",
"EMPTY AGGREGATE",
"AGGREGATE OF INT", "AGGREGATE OF INT",
"AGGREGATE OF DOUBLE", "AGGREGATE OF DOUBLE",
"AGGREGATE OF STRING", "AGGREGATE OF STRING",
"AGGREGATE OF BINARY", "AGGREGATE OF BINARY",
"AGGREGATE OF ENTITY INSTANCE", "AGGREGATE OF ENTITY INSTANCE",
"AGGREGATE OF EMPTY AGGREGATE",
"AGGREGATE OF AGGREGATE OF INT", "AGGREGATE OF AGGREGATE OF INT",
"AGGREGATE OF AGGREGATE OF DOUBLE", "AGGREGATE OF AGGREGATE OF DOUBLE",
"AGGREGATE OF AGGREGATE OF ENTITY INSTANCE", "AGGREGATE OF AGGREGATE OF ENTITY INSTANCE",
+3
View File
@@ -61,12 +61,14 @@ namespace IfcUtil {
Argument_ENUMERATION, Argument_ENUMERATION,
Argument_ENTITY_INSTANCE, Argument_ENTITY_INSTANCE,
Argument_EMPTY_AGGREGATE,
Argument_AGGREGATE_OF_INT, Argument_AGGREGATE_OF_INT,
Argument_AGGREGATE_OF_DOUBLE, Argument_AGGREGATE_OF_DOUBLE,
Argument_AGGREGATE_OF_STRING, Argument_AGGREGATE_OF_STRING,
Argument_AGGREGATE_OF_BINARY, Argument_AGGREGATE_OF_BINARY,
Argument_AGGREGATE_OF_ENTITY_INSTANCE, Argument_AGGREGATE_OF_ENTITY_INSTANCE,
Argument_AGGREGATE_OF_EMPTY_AGGREGATE,
Argument_AGGREGATE_OF_AGGREGATE_OF_INT, Argument_AGGREGATE_OF_AGGREGATE_OF_INT,
Argument_AGGREGATE_OF_AGGREGATE_OF_DOUBLE, Argument_AGGREGATE_OF_AGGREGATE_OF_DOUBLE,
Argument_AGGREGATE_OF_AGGREGATE_OF_ENTITY_INSTANCE, Argument_AGGREGATE_OF_AGGREGATE_OF_ENTITY_INSTANCE,
@@ -74,6 +76,7 @@ namespace IfcUtil {
Argument_UNKNOWN Argument_UNKNOWN
}; };
IFC_PARSE_API const char* ArgumentTypeToString(ArgumentType argument_type); IFC_PARSE_API const char* ArgumentTypeToString(ArgumentType argument_type);
class IFC_PARSE_API IfcBaseClass { class IFC_PARSE_API IfcBaseClass {
+1 -1
View File
@@ -65,7 +65,7 @@ namespace IfcWrite {
unsigned int id(); unsigned int id();
IfcWritableEntity* isWritable(); IfcWritableEntity* isWritable();
void setArgument(int i, Argument* a); void setArgument(int i, Argument* a, IfcUtil::ArgumentType attr_type = IfcUtil::Argument_UNKNOWN);
void setArgument(int i); void setArgument(int i);
void setArgumentDerived(int i); void setArgumentDerived(int i);
+10 -4
View File
@@ -144,8 +144,10 @@ void IfcWritableEntity::setArgument(int i) {
_setArgument(i, boost::none); _setArgument(i, boost::none);
} }
void IfcWritableEntity::setArgument(int i, Argument* a) { void IfcWritableEntity::setArgument(int i, Argument* a, IfcUtil::ArgumentType attr_type) {
IfcUtil::ArgumentType attr_type = a->type(); if (attr_type == IfcUtil::Argument_UNKNOWN) {
attr_type = a->type();
}
switch(attr_type) { switch(attr_type) {
case IfcUtil::Argument_NULL: case IfcUtil::Argument_NULL:
this->setArgument(i); this->setArgument(i);
@@ -224,14 +226,18 @@ void IfcWritableEntity::setArgument(int i, Argument* a) {
} }
this->setArgument(i, mapped_instances); } this->setArgument(i, mapped_instances); }
break; break;
case IfcUtil::Argument_EMPTY_AGGREGATE:
case IfcUtil::Argument_AGGREGATE_OF_EMPTY_AGGREGATE: {
IfcUtil::ArgumentType t2 = IfcSchema::Type::GetAttributeType(type(), (unsigned) i);
this->setArgument(i, a, t2); }
break;
default: default:
case IfcUtil::Argument_UNKNOWN: case IfcUtil::Argument_UNKNOWN:
throw IfcParse::IfcException("Unknown argument encountered"); throw IfcParse::IfcException(std::string("Unknown attribute encountered: '") + a->toString() + "' at index '" + boost::lexical_cast<std::string>(i) + "'");
break; break;
} }
} }
void IfcWritableEntity::setArgumentDerived(int i) { void IfcWritableEntity::setArgumentDerived(int i) {
_setArgument(i, IfcWriteArgument::Derived()); _setArgument(i, IfcWriteArgument::Derived());
} }