diff --git a/src/ifcopenshell-python/ifcopenshell/express/implementation.py b/src/ifcopenshell-python/ifcopenshell/express/implementation.py index b82209bf53..a500b41b2f 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/implementation.py +++ b/src/ifcopenshell-python/ifcopenshell/express/implementation.py @@ -55,6 +55,14 @@ class Implementation(codegen.Base): templates.enum_from_string_stmt % dict(context, **locals()) for value in enum.values ), ) + + for name, enum in mapping.schema.selects.items(): + write( + templates.select_function, + name=name, + schema_name=schema_name, + schema_name_upper=schema_name_upper + ) write = lambda str, **kwargs: entity_implementations.append(str % kwargs) @@ -348,6 +356,10 @@ class Implementation(codegen.Base): ("extern enumeration_type* %s_%%s_type;" % schema_name_upper) % n for n in mapping.schema.enumerations.keys() ] + + [ + ("extern select_type* %s_%%s_type;" % schema_name_upper) % n + for n in mapping.schema.selects.keys() + ] ) self.str = templates.implementation % { diff --git a/src/ifcopenshell-python/ifcopenshell/express/templates.py b/src/ifcopenshell-python/ifcopenshell/express/templates.py index 60be379b66..6870608335 100644 --- a/src/ifcopenshell-python/ifcopenshell/express/templates.py +++ b/src/ifcopenshell-python/ifcopenshell/express/templates.py @@ -137,7 +137,10 @@ simpletype_impl_cast_templated = ( simpletype_impl_declaration = "return *%(schema_name_upper)s_%(class_name)s_type;" select = """%(documentation)s -class IFC_PARSE_API %(name)s : public virtual IfcUtil::IfcBaseInterface {}; +class IFC_PARSE_API %(name)s : public virtual IfcUtil::IfcBaseInterface { +public: + static const IfcParse::select_type& Class(); +}; """ enumeration = """class IFC_PARSE_API %(name)s : public IfcUtil::IfcBaseType { @@ -167,6 +170,10 @@ public: }; """ +select_function = """ +const IfcParse::select_type& %(schema_name)s::%(name)s::Class() { return *%(schema_name_upper)s_%(name)s_type; } +""" + enumeration_function = """ const IfcParse::enumeration_type& %(schema_name)s::%(name)s::declaration() const { return *%(schema_name_upper)s_%(name)s_type; } const IfcParse::enumeration_type& %(schema_name)s::%(name)s::Class() { return *%(schema_name_upper)s_%(name)s_type; }