mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-09 21:53:40 +00:00
typing
This commit is contained in:
@@ -17,7 +17,16 @@
|
|||||||
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
|
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
def assign_scene_units(ifc, unit):
|
from __future__ import annotations
|
||||||
|
from typing import TYPE_CHECKING, Optional
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
import bpy
|
||||||
|
import ifcopenshell
|
||||||
|
import bonsai.tool as tool
|
||||||
|
|
||||||
|
|
||||||
|
def assign_scene_units(ifc: tool.Ifc, unit: tool.Unit) -> None:
|
||||||
if unit.is_scene_unit_metric():
|
if unit.is_scene_unit_metric():
|
||||||
prefix = unit.get_scene_unit_si_prefix("LENGTHUNIT")
|
prefix = unit.get_scene_unit_si_prefix("LENGTHUNIT")
|
||||||
lengthunit = ifc.run("unit.add_si_unit", unit_type="LENGTHUNIT", prefix=prefix)
|
lengthunit = ifc.run("unit.add_si_unit", unit_type="LENGTHUNIT", prefix=prefix)
|
||||||
@@ -35,64 +44,66 @@ def assign_scene_units(ifc, unit):
|
|||||||
ifc.run("unit.assign_unit", units=[lengthunit, areaunit, volumeunit, planeangleunit])
|
ifc.run("unit.assign_unit", units=[lengthunit, areaunit, volumeunit, planeangleunit])
|
||||||
|
|
||||||
|
|
||||||
def assign_unit(ifc, unit_tool, unit=None):
|
def assign_unit(ifc: tool.Ifc, unit_tool: tool.Unit, unit: ifcopenshell.entity_instance) -> None:
|
||||||
ifc.run("unit.assign_unit", units=[unit])
|
ifc.run("unit.assign_unit", units=[unit])
|
||||||
unit_tool.import_units()
|
unit_tool.import_units()
|
||||||
|
|
||||||
|
|
||||||
def unassign_unit(ifc, unit_tool, unit=None):
|
def unassign_unit(ifc: tool.Ifc, unit_tool: tool.Unit, unit: ifcopenshell.entity_instance) -> None:
|
||||||
ifc.run("unit.unassign_unit", units=[unit])
|
ifc.run("unit.unassign_unit", units=[unit])
|
||||||
unit_tool.import_units()
|
unit_tool.import_units()
|
||||||
|
|
||||||
|
|
||||||
def load_units(unit):
|
def load_units(unit: tool.Unit) -> None:
|
||||||
unit.import_units()
|
unit.import_units()
|
||||||
unit.enable_editing_units()
|
unit.enable_editing_units()
|
||||||
|
|
||||||
|
|
||||||
def disable_unit_editing_ui(unit):
|
def disable_unit_editing_ui(unit: tool.Unit) -> None:
|
||||||
unit.disable_editing_units()
|
unit.disable_editing_units()
|
||||||
|
|
||||||
|
|
||||||
def remove_unit(ifc, unit_tool, unit=None):
|
def remove_unit(ifc: tool.Ifc, unit_tool: tool.Unit, unit: ifcopenshell.entity_instance) -> None:
|
||||||
ifc.run("unit.remove_unit", unit=unit)
|
ifc.run("unit.remove_unit", unit=unit)
|
||||||
unit_tool.import_units()
|
unit_tool.import_units()
|
||||||
|
|
||||||
|
|
||||||
def add_monetary_unit(ifc, unit):
|
def add_monetary_unit(ifc: tool.Ifc, unit: tool.Unit) -> ifcopenshell.entity_instance:
|
||||||
result = ifc.run("unit.add_monetary_unit")
|
result = ifc.run("unit.add_monetary_unit")
|
||||||
unit.import_units()
|
unit.import_units()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def add_si_unit(ifc, unit, unit_type=None):
|
def add_si_unit(ifc: tool.Ifc, unit: tool.Unit, unit_type: str) -> ifcopenshell.entity_instance:
|
||||||
result = ifc.run("unit.add_si_unit", unit_type=unit_type)
|
result = ifc.run("unit.add_si_unit", unit_type=unit_type)
|
||||||
unit.import_units()
|
unit.import_units()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def add_context_dependent_unit(ifc, unit, unit_type=None, name=None):
|
def add_context_dependent_unit(
|
||||||
|
ifc: tool.Ifc, unit: tool.Unit, unit_type: str, name: str
|
||||||
|
) -> ifcopenshell.entity_instance:
|
||||||
result = ifc.run("unit.add_context_dependent_unit", unit_type=unit_type, name=name)
|
result = ifc.run("unit.add_context_dependent_unit", unit_type=unit_type, name=name)
|
||||||
unit.import_units()
|
unit.import_units()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def add_conversion_based_unit(ifc, unit, name=None):
|
def add_conversion_based_unit(ifc: tool.Ifc, unit: tool.Unit, name: str) -> ifcopenshell.entity_instance:
|
||||||
result = ifc.run("unit.add_conversion_based_unit", name=name)
|
result = ifc.run("unit.add_conversion_based_unit", name=name)
|
||||||
unit.import_units()
|
unit.import_units()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def enable_editing_unit(unit_tool, unit=None):
|
def enable_editing_unit(unit_tool: tool.Unit, unit: ifcopenshell.entity_instance) -> None:
|
||||||
unit_tool.set_active_unit(unit)
|
unit_tool.set_active_unit(unit)
|
||||||
unit_tool.import_unit_attributes(unit)
|
unit_tool.import_unit_attributes(unit)
|
||||||
|
|
||||||
|
|
||||||
def disable_editing_unit(unit):
|
def disable_editing_unit(unit: tool.Unit) -> None:
|
||||||
unit.clear_active_unit()
|
unit.clear_active_unit()
|
||||||
|
|
||||||
|
|
||||||
def edit_unit(ifc, unit_tool, unit=None):
|
def edit_unit(ifc: tool.Ifc, unit_tool: tool.Unit, unit: ifcopenshell.entity_instance) -> None:
|
||||||
attributes = unit_tool.export_unit_attributes()
|
attributes = unit_tool.export_unit_attributes()
|
||||||
if unit_tool.is_unit_class(unit, "IfcMonetaryUnit"):
|
if unit_tool.is_unit_class(unit, "IfcMonetaryUnit"):
|
||||||
ifc.run("unit.edit_monetary_unit", unit=unit, attributes=attributes)
|
ifc.run("unit.edit_monetary_unit", unit=unit, attributes=attributes)
|
||||||
|
|||||||
@@ -22,23 +22,27 @@ import ifcopenshell
|
|||||||
import bonsai.bim.helper
|
import bonsai.bim.helper
|
||||||
import bonsai.core.tool
|
import bonsai.core.tool
|
||||||
import bonsai.tool as tool
|
import bonsai.tool as tool
|
||||||
|
from typing import Union, Literal, Any
|
||||||
|
from typing_extensions import assert_never
|
||||||
|
|
||||||
|
|
||||||
class Unit(bonsai.core.tool.Unit):
|
class Unit(bonsai.core.tool.Unit):
|
||||||
|
UNIT_TYPE = Literal["LENGTHUNIT", "AREAUNIT", "VOLUMEUNIT"]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def clear_active_unit(cls):
|
def clear_active_unit(cls) -> None:
|
||||||
bpy.context.scene.BIMUnitProperties.active_unit_id = 0
|
bpy.context.scene.BIMUnitProperties.active_unit_id = 0
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def disable_editing_units(cls):
|
def disable_editing_units(cls) -> None:
|
||||||
bpy.context.scene.BIMUnitProperties.is_editing = False
|
bpy.context.scene.BIMUnitProperties.is_editing = False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def enable_editing_units(cls):
|
def enable_editing_units(cls) -> None:
|
||||||
bpy.context.scene.BIMUnitProperties.is_editing = True
|
bpy.context.scene.BIMUnitProperties.is_editing = True
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def export_unit_attributes(cls):
|
def export_unit_attributes(cls) -> dict[str, Any]:
|
||||||
def callback(attributes, prop):
|
def callback(attributes, prop):
|
||||||
if prop.name == "Dimensions":
|
if prop.name == "Dimensions":
|
||||||
try:
|
try:
|
||||||
@@ -51,7 +55,7 @@ class Unit(bonsai.core.tool.Unit):
|
|||||||
return bonsai.bim.helper.export_attributes(props.unit_attributes, callback=callback)
|
return bonsai.bim.helper.export_attributes(props.unit_attributes, callback=callback)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_scene_unit_name(cls, unit_type):
|
def get_scene_unit_name(cls, unit_type: UNIT_TYPE) -> str:
|
||||||
if unit_type == "LENGTHUNIT":
|
if unit_type == "LENGTHUNIT":
|
||||||
props = bpy.context.scene.unit_settings
|
props = bpy.context.scene.unit_settings
|
||||||
if props.length_unit == "MILES":
|
if props.length_unit == "MILES":
|
||||||
@@ -67,9 +71,11 @@ class Unit(bonsai.core.tool.Unit):
|
|||||||
return bpy.context.scene.BIMProperties.area_unit
|
return bpy.context.scene.BIMProperties.area_unit
|
||||||
elif unit_type == "VOLUMEUNIT":
|
elif unit_type == "VOLUMEUNIT":
|
||||||
return bpy.context.scene.BIMProperties.volume_unit
|
return bpy.context.scene.BIMProperties.volume_unit
|
||||||
|
else:
|
||||||
|
assert_never()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_scene_unit_si_prefix(cls, unit_type):
|
def get_scene_unit_si_prefix(cls, unit_type: UNIT_TYPE) -> Union[str, None]:
|
||||||
if unit_type == "LENGTHUNIT":
|
if unit_type == "LENGTHUNIT":
|
||||||
props = bpy.context.scene.unit_settings
|
props = bpy.context.scene.unit_settings
|
||||||
if props.length_unit == "ADAPTIVE" or props.length_unit == "METERS":
|
if props.length_unit == "ADAPTIVE" or props.length_unit == "METERS":
|
||||||
@@ -79,11 +85,13 @@ class Unit(bonsai.core.tool.Unit):
|
|||||||
unit = bpy.context.scene.BIMProperties.area_unit
|
unit = bpy.context.scene.BIMProperties.area_unit
|
||||||
elif unit_type == "VOLUMEUNIT":
|
elif unit_type == "VOLUMEUNIT":
|
||||||
unit = bpy.context.scene.BIMProperties.volume_unit
|
unit = bpy.context.scene.BIMProperties.volume_unit
|
||||||
|
else:
|
||||||
|
assert_never(unit_type)
|
||||||
if "/" in unit:
|
if "/" in unit:
|
||||||
return unit.split("/")[0]
|
return unit.split("/")[0]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def import_unit_attributes(cls, unit):
|
def import_unit_attributes(cls, unit: ifcopenshell.entity_instance) -> None:
|
||||||
def callback(name, prop, data):
|
def callback(name, prop, data):
|
||||||
if name == "Dimensions" and data["type"] != "IfcSIUnit":
|
if name == "Dimensions" and data["type"] != "IfcSIUnit":
|
||||||
new = bpy.context.scene.BIMUnitProperties.unit_attributes.add()
|
new = bpy.context.scene.BIMUnitProperties.unit_attributes.add()
|
||||||
@@ -99,7 +107,7 @@ class Unit(bonsai.core.tool.Unit):
|
|||||||
bonsai.bim.helper.import_attributes2(unit, props.unit_attributes, callback=callback)
|
bonsai.bim.helper.import_attributes2(unit, props.unit_attributes, callback=callback)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def import_units(cls):
|
def import_units(cls) -> None:
|
||||||
props = bpy.context.scene.BIMUnitProperties
|
props = bpy.context.scene.BIMUnitProperties
|
||||||
props.units.clear()
|
props.units.clear()
|
||||||
|
|
||||||
@@ -140,19 +148,19 @@ class Unit(bonsai.core.tool.Unit):
|
|||||||
new.ifc_class = unit.is_a()
|
new.ifc_class = unit.is_a()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def is_scene_unit_metric(cls):
|
def is_scene_unit_metric(cls) -> bool:
|
||||||
return bpy.context.scene.unit_settings.system in ["METRIC", "NONE"]
|
return bpy.context.scene.unit_settings.system in ["METRIC", "NONE"]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def is_unit_class(cls, unit, ifc_class):
|
def is_unit_class(cls, unit: ifcopenshell.entity_instance, ifc_class: str) -> bool:
|
||||||
return unit.is_a(ifc_class)
|
return unit.is_a(ifc_class)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def set_active_unit(cls, unit):
|
def set_active_unit(cls, unit: ifcopenshell.entity_instance) -> None:
|
||||||
bpy.context.scene.BIMUnitProperties.active_unit_id = unit.id()
|
bpy.context.scene.BIMUnitProperties.active_unit_id = unit.id()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_project_currency_unit(cls):
|
def get_project_currency_unit(cls) -> Union[ifcopenshell.entity_instance, None]:
|
||||||
unit_assignments = tool.Ifc.get().by_type("IfcUnitAssignment")
|
unit_assignments = tool.Ifc.get().by_type("IfcUnitAssignment")
|
||||||
for assignment in unit_assignments:
|
for assignment in unit_assignments:
|
||||||
for unit in assignment.Units:
|
for unit in assignment.Units:
|
||||||
@@ -160,13 +168,13 @@ class Unit(bonsai.core.tool.Unit):
|
|||||||
return unit
|
return unit
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_currency_name(cls):
|
def get_currency_name(cls) -> Union[str, None]:
|
||||||
unit = cls.get_project_currency_unit()
|
unit = cls.get_project_currency_unit()
|
||||||
if unit:
|
if unit:
|
||||||
return unit.Currency
|
return unit.Currency
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def blender_format_unit(cls, value):
|
def blender_format_unit(cls, value: float) -> str:
|
||||||
return bpy.utils.units.to_string(
|
return bpy.utils.units.to_string(
|
||||||
bpy.context.scene.unit_settings.system,
|
bpy.context.scene.unit_settings.system,
|
||||||
"LENGTH",
|
"LENGTH",
|
||||||
|
|||||||
Reference in New Issue
Block a user