initial proposal for updating units conversion

This commit is contained in:
krande
2023-12-16 13:37:38 +01:00
parent c9200fb73c
commit 5c75cc6a39
2 changed files with 90 additions and 49 deletions
@@ -21,6 +21,7 @@ import ifcopenshell.api
import ifcopenshell.api.owner.settings
import ifcopenshell.util.pset
import ifcopenshell.util.element
import ifcopenshell.util.unit
class Patcher:
@@ -47,44 +48,7 @@ class Patcher:
self.file = file
self.logger = logger
self.unit = unit
self.file_patched: ifcopenshell.file = None
def patch(self):
unit = {"is_metric": "METERS" in self.unit, "raw": self.unit}
self.file_patched = ifcopenshell.api.run("project.create_file", version=self.file.schema)
if self.file.schema == "IFC2X3":
user = self.file_patched.add(self.file.by_type("IfcProject")[0].OwnerHistory.OwningUser)
application = self.file_patched.add(self.file.by_type("IfcProject")[0].OwnerHistory.OwningApplication)
old_get_user = ifcopenshell.api.owner.settings.get_user
old_get_application = ifcopenshell.api.owner.settings.get_application
ifcopenshell.api.owner.settings.get_user = lambda ifc: user
ifcopenshell.api.owner.settings.get_application = lambda ifc: application
project = ifcopenshell.api.run("root.create_entity", self.file_patched, ifc_class="IfcProject")
unit_assignment = ifcopenshell.api.run("unit.assign_unit", self.file_patched, **{"length": unit})
# Is there a better way?
for element in self.file.by_type("IfcGeometricRepresentationContext", include_subtypes=False):
element.Precision = 1e-8
# If we don't add openings first, they don't get converted
for element in self.file.by_type("IfcOpeningElement"):
self.file_patched.add(element)
for element in self.file:
self.file_patched.add(element)
new_length = [u for u in unit_assignment.Units if getattr(u, "UnitType", None) == "LENGTHUNIT"][0]
old_length = [
u
for u in self.file_patched.by_type("IfcProject")[1].UnitsInContext.Units
if getattr(u, "UnitType", None) == "LENGTHUNIT"
][0]
for inverse in self.file_patched.get_inverse(old_length):
ifcopenshell.util.element.replace_attribute(inverse, old_length, new_length)
self.file_patched.remove(old_length)
self.file_patched.remove(project)
if self.file.schema == "IFC2X3":
ifcopenshell.api.owner.settings.get_user = old_get_user
ifcopenshell.api.owner.settings.get_application = old_get_application
self.file_patched = ifcopenshell.util.unit.convert_file_units(self.file, self.unit)