Roundtripping native geometry now works across different IFC schema versions

This commit is contained in:
Dion Moult
2020-11-25 20:17:17 +11:00
parent 33b2661464
commit 4bff3dc3dd
3 changed files with 22 additions and 11 deletions
@@ -70,10 +70,10 @@ class Migrator:
return new_file.by_id(self.migrated_ids[element.id()])
except:
pass
print("Migrating", element)
#print("Migrating", element)
schema = ifcopenshell.ifcopenshell_wrapper.schema_by_name(new_file.schema)
new_element = self.migrate_class(element, new_file)
print("Migrated class from {} to {}".format(element, new_element))
#print("Migrated class from {} to {}".format(element, new_element))
new_element_schema = schema.declaration_by_name(new_element.is_a())
if not hasattr(new_element_schema, "all_attributes"):
return element # The element has no attributes, so migration is done
@@ -91,6 +91,7 @@ class Migrator:
new_element = new_file.create_entity(self.class_4_to_2x3[element.is_a()])
elif new_file.schema == "IFC4":
print("Class migration to IFC4 not yet supported for", element)
pass
return new_element
def migrate_attributes(self, element, new_file, new_element, new_element_schema):
@@ -101,18 +102,18 @@ class Migrator:
return new_element
def migrate_attribute(self, attribute, element, new_file, new_element, new_element_schema):
print("Migrating attribute", element, new_element, attribute.name())
#print("Migrating attribute", element, new_element, attribute.name())
if hasattr(element, attribute.name()):
value = getattr(element, attribute.name())
print("Attribute names matched", value)
#print("Attribute names matched", value)
elif new_file.schema == "IFC2X3":
# IFC4 to IFC2X3: We know the IFC2X3 attribute name, but not its IFC4 equivalent
print("Searching for an equivalent", new_element, attribute.name())
#print("Searching for an equivalent", new_element, attribute.name())
try:
equivalent_map = self.attribute_4_to_2x3[new_element.is_a()]
equivalent = list(equivalent_map.keys())[list(equivalent_map.values()).index(attribute.name())]
if hasattr(element, equivalent):
print("Equivalent found", equivalent)
#print("Equivalent found", equivalent)
value = getattr(element, equivalent)
else:
return
@@ -121,10 +122,10 @@ class Migrator:
return # We tried our best
elif new_file.schema == "IFC4":
# IFC2X3 to IFC4: We know the IFC4 attribute name, but not its IFC2X3 equivalent
print("Searching for an equivalent", element, new_element, attribute.name())
#print("Searching for an equivalent", element, new_element, attribute.name())
try:
equivalent = self.attribute_4_to_2x3[new_element.is_a()][attribute.name()]
print("Searching for equivalent", equivalent)
#print("Searching for equivalent", equivalent)
if hasattr(element, equivalent):
value = getattr(element, equivalent)
else:
@@ -133,7 +134,7 @@ class Migrator:
print("Unable to find equivalent attribute of {} to migrate from {} to {}".format(attribute.name(), element, new_element))
return # We tried our best
print("Continuing migration of {} to migrate from {} to {}".format(attribute.name(), element, new_element))
#print("Continuing migration of {} to migrate from {} to {}".format(attribute.name(), element, new_element))
if value is None and not attribute.optional():
value = self.generate_default_value(attribute, new_file)
if value is None: