Add documentation for some unit utilities

This commit is contained in:
Dion Moult
2024-05-27 09:42:28 +10:00
parent f2ca030fab
commit 7142f3856c
@@ -421,8 +421,8 @@ def get_project_unit(ifc_file: ifcopenshell.file, unit_type: str) -> Union[ifcop
:param unit_type: The type of unit, taken from the list of IFC unit types, :param unit_type: The type of unit, taken from the list of IFC unit types,
such as "LENGTHUNIT". such as "LENGTHUNIT".
:type unit_type: str :type unit_type: str
:return: The IFC unit entity, or nothing if there is no default project unit :return: The IFC unit entity, or nothing if there is no default project
defined. unit defined.
:rtype: Union[ifcopenshell.entity_instance, None] :rtype: Union[ifcopenshell.entity_instance, None]
""" """
unit_assignment = get_unit_assignment(ifc_file) unit_assignment = get_unit_assignment(ifc_file)
@@ -435,6 +435,20 @@ def get_project_unit(ifc_file: ifcopenshell.file, unit_type: str) -> Union[ifcop
def get_property_unit( def get_property_unit(
prop: ifcopenshell.entity_instance, ifc_file: ifcopenshell.file prop: ifcopenshell.entity_instance, ifc_file: ifcopenshell.file
) -> Union[ifcopenshell.entity_instance, None]: ) -> Union[ifcopenshell.entity_instance, None]:
"""Gets the unit definition of a property or quantity
Properties and quantities in psets and qtos can be associated with a unit.
This unit may be defined at the property itself explicitly, or if not
specified, fallback to the project default.
:param prop: The property instance. You can fetch this via the instance ID
if doing :func:`ifcopenshell.util.element.get_psets` with
``verbose=True``.
:param ifc_file: The IFC file being used. This is necessary to check
default project units.
:return: The IFC unit entity, or nothing if there is no default project
unit defined.
"""
unit = getattr(prop, "Unit", None) unit = getattr(prop, "Unit", None)
if unit: if unit:
return unit return unit
@@ -488,6 +502,16 @@ def get_property_unit(
def get_unit_measure_class(unit_type: str) -> MEASURE_CLASS: def get_unit_measure_class(unit_type: str) -> MEASURE_CLASS:
"""Get the IFC measure class for a unit type.
IFC has specific classes used to measure different units. An example of an
IFC measure class is ``IfcLengthMeasure``. An example of the correlating
unit type (i.e. the IfcUnitEnum) is ``LENGTHUNIT``.
The inverse function of this is :func:`get_measure_unit_type`
:param unit_type: A string chosen from IfcUnitEnum, such as LENGTHUNIT
"""
if unit_type == "USERDEFINED": if unit_type == "USERDEFINED":
# See https://github.com/buildingSMART/IFC4.3.x-development/issues/71 # See https://github.com/buildingSMART/IFC4.3.x-development/issues/71
return "IfcNumericMeasure" return "IfcNumericMeasure"
@@ -495,6 +519,20 @@ def get_unit_measure_class(unit_type: str) -> MEASURE_CLASS:
def get_measure_unit_type(measure_class: MEASURE_CLASS) -> str: def get_measure_unit_type(measure_class: MEASURE_CLASS) -> str:
"""Get the unit type of an IFC measure class
IFC has different unit types which can be associated with units (e.g. SI
units, imperial units, derived units, etc). An example of a unit type (i.e.
an IfcUnitEnum) is ``LENGTHUNIT``. An example of the correlating measure
class used to store length data is ``IfcLengthMeasure``.
The inverse fucntion of this is :func:`get_unit_measure_class`
:param measure_class: The measure class, such as ``IfcLengthMeasure``. If
you have an ``IfcPropertySingleValue``, you can get this using
``prop.NominalValue.is_a()``.
:return: The unit type, as an uppercase value of IfcUnitEnum.
"""
if measure_class == "IfcNumericMeasure": if measure_class == "IfcNumericMeasure":
# See https://github.com/buildingSMART/IFC4.3.x-development/issues/71 # See https://github.com/buildingSMART/IFC4.3.x-development/issues/71
return "USERDEFINED" return "USERDEFINED"