mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-10-02 21:12:07 +00:00
Type hint from schema when encountering empty aggregate. Fixes #127
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user