Files
IfcOpenShell/src/ifcopenshell-python/ifcopenshell/api/unit/assign_unit.py
T

77 lines
3.0 KiB
Python

import ifcopenshell.util.unit
class Usecase():
def __init__(self, file, **settings):
self.file = file
self.settings = {
"length": {
"is_metric": True,
"raw": "MILLIMETERS"
},
"area": {
"is_metric": True,
"raw": "METERS"
},
"volume": {
"is_metric": True,
"raw": "METERS"
},
}
for key, value in settings.items():
self.settings[key] = value
def execute(self):
for unit_type, data in self.settings.items():
if data["is_metric"]:
data["ifc"] = self.create_metric_unit(unit_type, data)
else:
data["ifc"] = self.create_imperial_unit(unit_type, data)
unit_assignment = self.file.by_type("IfcUnitAssignment")
if unit_assignment:
unit_assignment = unit_assignment[0]
# TODO: handle unit rewriting, which is complicated
else:
unit_assignment = self.file.createIfcUnitAssignment([u["ifc"] for u in self.settings.values()])
self.file.by_type("IfcProject")[0].UnitsInContext = unit_assignment
return unit_assignment
def create_metric_unit(self, unit_type, data):
type_prefix = ""
if unit_type == "area":
type_prefix = "SQUARE_"
elif unit_type == "volume":
type_prefix = "CUBIC_"
return self.file.createIfcSIUnit(
None,
"{}UNIT".format(unit_type.upper()),
ifcopenshell.util.unit.get_prefix(data["raw"]),
type_prefix + ifcopenshell.util.unit.get_unit_name(data["raw"]),
)
def create_imperial_unit(self, unit_type, data):
if unit_type == "length":
dimensional_exponents = self.file.createIfcDimensionalExponents(1, 0, 0, 0, 0, 0, 0)
name_prefix = ""
elif unit_type == "area":
dimensional_exponents = self.file.createIfcDimensionalExponents(2, 0, 0, 0, 0, 0, 0)
name_prefix = "square"
elif unit_type == "volume":
dimensional_exponents = self.file.createIfcDimensionalExponents(3, 0, 0, 0, 0, 0, 0)
name_prefix = "cubic"
si_unit = self.file.createIfcSIUnit(
None,
"{}UNIT".format(unit_type.upper()),
None,
"{}METRE".format(name_prefix.upper() + "_" if name_prefix else ""),
)
if data["raw"] == "INCHES":
name = "{}inch".format(name_prefix + " " if name_prefix else "")
elif data["raw"] == "FEET":
name = "{}foot".format(name_prefix + " " if name_prefix else "")
value_component = self.file.create_entity("IfcReal", **{"wrappedValue": ifcopenshell.util.unit.si_conversions[name]})
conversion_factor = self.file.createIfcMeasureWithUnit(value_component, si_unit)
return self.file.createIfcConversionBasedUnit(
dimensional_exponents, "{}UNIT".format(unit_type.upper()), name, conversion_factor
)