mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-20 23:36:20 +00:00
filter out redundant select membership with inheritance
This commit is contained in:
@@ -18,6 +18,7 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
import operator
|
import operator
|
||||||
|
import itertools
|
||||||
|
|
||||||
import codegen
|
import codegen
|
||||||
import templates
|
import templates
|
||||||
@@ -48,11 +49,11 @@ class Header(codegen.Base):
|
|||||||
select_super_types[str(nm).lower()].append(name)
|
select_super_types[str(nm).lower()].append(name)
|
||||||
write(templates.select, name=name)
|
write(templates.select, name=name)
|
||||||
|
|
||||||
def get_select_super_types(nm):
|
def get_select_super_types(nm, bases=[]):
|
||||||
x = list(select_super_types[nm.lower()])
|
x = list(select_super_types[nm.lower()])
|
||||||
for y in x:
|
for y in x:
|
||||||
x.extend(get_select_super_types(y))
|
x.extend(get_select_super_types(y))
|
||||||
return sorted(set(x))
|
return sorted(set(x) - set(itertools.chain.from_iterable(map(get_select_super_types, bases))))
|
||||||
|
|
||||||
for name, type in mapping.schema.enumerations.items():
|
for name, type in mapping.schema.enumerations.items():
|
||||||
short_name = name[:-4] if name.endswith("Enum") else name
|
short_name = name[:-4] if name.endswith("Enum") else name
|
||||||
@@ -70,11 +71,15 @@ class Header(codegen.Base):
|
|||||||
superclass = mapping.simple_type_parent(name)
|
superclass = mapping.simple_type_parent(name)
|
||||||
|
|
||||||
superclasses = []
|
superclasses = []
|
||||||
|
all_superclasses = []
|
||||||
if superclass is not None:
|
if superclass is not None:
|
||||||
superclasses.append(superclass)
|
superclasses.append(superclass)
|
||||||
|
while superclass:
|
||||||
|
all_superclasses.append(superclass)
|
||||||
|
superclass = mapping.simple_type_parent(superclass)
|
||||||
else:
|
else:
|
||||||
superclasses.append("IfcUtil::IfcBaseType")
|
superclasses.append("IfcUtil::IfcBaseType")
|
||||||
superclasses.extend(get_select_super_types(name))
|
superclasses.extend(get_select_super_types(name, bases=all_superclasses))
|
||||||
|
|
||||||
is_emitted = lambda nm: nm == "IfcUtil::IfcBaseType" or nm in mapping.schema.selects or nm.lower() in emitted_simpletypes
|
is_emitted = lambda nm: nm == "IfcUtil::IfcBaseType" or nm in mapping.schema.selects or nm.lower() in emitted_simpletypes
|
||||||
if not all(map(is_emitted, superclasses)):
|
if not all(map(is_emitted, superclasses)):
|
||||||
@@ -84,9 +89,9 @@ class Header(codegen.Base):
|
|||||||
|
|
||||||
emitted_simpletypes.add(name.lower())
|
emitted_simpletypes.add(name.lower())
|
||||||
|
|
||||||
superclass = create_supertype_statement(superclasses)
|
superclass_statement = create_supertype_statement(superclasses)
|
||||||
|
|
||||||
write(templates.simpletype, name=name, type=type_str, attr_type=attr_type, superclass=superclass)
|
write(templates.simpletype, name=name, type=type_str, attr_type=attr_type, superclass=superclass_statement)
|
||||||
|
|
||||||
class_definitions = []
|
class_definitions = []
|
||||||
|
|
||||||
@@ -134,8 +139,14 @@ class Header(codegen.Base):
|
|||||||
if len(inverse):
|
if len(inverse):
|
||||||
inverse += "\n"
|
inverse += "\n"
|
||||||
|
|
||||||
|
all_supertypes = []
|
||||||
|
tt = type
|
||||||
|
while len(tt.supertypes):
|
||||||
|
all_supertypes.append(tt.supertypes[0])
|
||||||
|
tt = mapping.schema.entities[tt.supertypes[0]]
|
||||||
|
|
||||||
supertypes = list(type.supertypes) if len(type.supertypes) else ["IfcUtil::IfcBaseEntity"]
|
supertypes = list(type.supertypes) if len(type.supertypes) else ["IfcUtil::IfcBaseEntity"]
|
||||||
supertypes.extend(get_select_super_types(name))
|
supertypes.extend(get_select_super_types(name, bases=all_supertypes))
|
||||||
supertypes = list(map(case_normalize, supertypes))
|
supertypes = list(map(case_normalize, supertypes))
|
||||||
superclass = create_supertype_statement(supertypes)
|
superclass = create_supertype_statement(supertypes)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user