This commit is contained in:
Andrej730
2025-06-24 12:57:34 +05:00
parent 50d3cab1ec
commit fcaeb920ec
8 changed files with 56 additions and 28 deletions
+11 -6
View File
@@ -285,7 +285,7 @@ class DecoratorData:
return thickness return thickness
@classmethod @classmethod
def get_section_markers_display_data(cls, obj): def get_section_markers_display_data(cls, obj: bpy.types.Object) -> Union[dict[str, Any], None]:
"""used by IfcAnnotations with ObjectType = "SECTION" """ """used by IfcAnnotations with ObjectType = "SECTION" """
result = cls.data.get(obj.name, None) result = cls.data.get(obj.name, None)
if result is not None: if result is not None:
@@ -327,10 +327,11 @@ class DecoratorData:
return display_data return display_data
@classmethod @classmethod
def get_text_data(cls, obj: bpy.types.Object) -> dict: def get_text_data(cls, obj: bpy.types.Object) -> dict[str, Any]:
"""used by Ifc Annotations with ObjectType = "TEXT" / "TEXT_LEADER"\n """used by Ifc Annotations with ObjectType = "TEXT" / "TEXT_LEADER"\n
returns font size in mm for current ifc text object""" returns font size in mm for current ifc text object"""
element = tool.Ifc.get_entity(obj) element = tool.Ifc.get_entity(obj)
assert element
props = tool.Drawing.get_text_props(obj) props = tool.Drawing.get_text_props(obj)
# getting font size # getting font size
pset_data = ifcopenshell.util.element.get_pset(element, "EPset_Annotation") or {} pset_data = ifcopenshell.util.element.get_pset(element, "EPset_Annotation") or {}
@@ -371,16 +372,18 @@ class DecoratorData:
return {"Literals": literals_data, "FontSize": font_size, "Symbol": symbol, "Newline_At": newline_at} return {"Literals": literals_data, "FontSize": font_size, "Symbol": symbol, "Newline_At": newline_at}
@classmethod @classmethod
def get_dimension_data(cls, obj): def get_dimension_data(cls, obj: bpy.types.Object) -> dict[str, Any]:
"""used by Ifc Annotations with ObjectType: """used by Ifc Annotations with ObjectType:
DIMENSION / DIAMETER / SECTION_LEVEL / PLAN_LEVEL / RADIUS DIMENSION / DIAMETER / SECTION_LEVEL / PLAN_LEVEL / RADIUS
""" """
element = tool.Ifc.get_entity(obj) element = tool.Ifc.get_entity(obj)
assert element
dimension_style = "arrow" dimension_style = "arrow"
fill_bg = False fill_bg = False
classes = ifcopenshell.util.element.get_pset(element, "EPset_Annotation", "Classes") classes = ifcopenshell.util.element.get_pset(element, "EPset_Annotation", "Classes")
if classes: if classes:
assert type(classes) is str
classes_split = classes.lower().split() classes_split = classes.lower().split()
if "oblique" in classes_split: if "oblique" in classes_split:
dimension_style = "oblique" dimension_style = "oblique"
@@ -406,15 +409,17 @@ class DecoratorData:
} }
@classmethod @classmethod
def get_fall_data(cls, obj): def get_fall_data(cls, obj: bpy.types.Object) -> dict[str, Union[str, None]]:
object_type = None object_type = None
if element := tool.Ifc.get_entity(obj): if element := tool.Ifc.get_entity(obj):
object_type = ifcopenshell.util.element.get_predefined_type(element) object_type = ifcopenshell.util.element.get_predefined_type(element)
return {"object_type": object_type} return {"object_type": object_type}
@classmethod @classmethod
def get_symbol_data(cls, obj): def get_symbol_data(cls, obj: bpy.types.Object) -> Union[str, None]:
return tool.Drawing.get_annotation_symbol(tool.Ifc.get_entity(obj)) element = tool.Ifc.get_entity(obj)
assert element
return tool.Drawing.get_annotation_symbol(element)
@classmethod @classmethod
def object_decorators(cls, handler): def object_decorators(cls, handler):
+3
View File
@@ -36,6 +36,7 @@ from bonsai.bim.module.model.stair import regenerate_stair_mesh
from bonsai.bim.module.model.railing import update_railing_modifier_bmesh from bonsai.bim.module.model.railing import update_railing_modifier_bmesh
from bonsai.bim.module.model.roof import update_roof_modifier_bmesh from bonsai.bim.module.model.roof import update_roof_modifier_bmesh
from collections.abc import Iterable from collections.abc import Iterable
from typing import Any
class BIM_MT_type_manager_menu(bpy.types.Menu): class BIM_MT_type_manager_menu(bpy.types.Menu):
@@ -95,6 +96,7 @@ class LaunchTypeManager(bpy.types.Operator):
return context.window_manager.invoke_props_dialog(self, width=550, title="Type Manager", confirm_text="Close") return context.window_manager.invoke_props_dialog(self, width=550, title="Type Manager", confirm_text="Close")
def draw(self, context): def draw(self, context):
assert self.layout
props = tool.Model.get_model_props() props = tool.Model.get_model_props()
row = self.layout.row(align=True) row = self.layout.row(align=True)
text = f"{AuthoringData.data['total_types']} {AuthoringData.data['ifc_element_type'] or 'Types'}" text = f"{AuthoringData.data['total_types']} {AuthoringData.data['ifc_element_type'] or 'Types'}"
@@ -135,6 +137,7 @@ class LaunchTypeManager(bpy.types.Operator):
flow = self.layout.grid_flow(row_major=True, columns=3, even_columns=True, even_rows=True, align=True) flow = self.layout.grid_flow(row_major=True, columns=3, even_columns=True, even_rows=True, align=True)
relating_type: dict[str, Any]
for relating_type in AuthoringData.data["paginated_relating_types"]: for relating_type in AuthoringData.data["paginated_relating_types"]:
outer_col = flow.column() outer_col = flow.column()
box = outer_col.box() box = outer_col.box()
@@ -29,7 +29,7 @@ from bpy.types import WorkSpaceTool, Menu
from bonsai.bim.module.model.data import AuthoringData, ItemData from bonsai.bim.module.model.data import AuthoringData, ItemData
from bonsai.bim.module.system.data import PortData from bonsai.bim.module.system.data import PortData
from bonsai.bim.module.model.prop import get_ifc_class from bonsai.bim.module.model.prop import get_ifc_class
from typing import Optional, Union from typing import Optional, Union, Any
from functools import partial from functools import partial
@@ -506,15 +506,17 @@ class CreateObjectUI:
cls.draw_type_manager_launcher(context) cls.draw_type_manager_launcher(context)
@classmethod @classmethod
def draw_container_info(cls, context): def draw_container_info(cls, context: bpy.types.Context) -> None:
text = AuthoringData.data["default_container"] text = AuthoringData.data["default_container"]
assert context.region
if context.region.type == "UI": if context.region.type == "UI":
text = f"Container: {text}" text = f"Container: {text}"
cls.layout.row(align=True).label(text=text, icon="OUTLINER_COLLECTION") cls.layout.row(align=True).label(text=text, icon="OUTLINER_COLLECTION")
@classmethod @classmethod
def draw_type_manager_launcher(cls, context): def draw_type_manager_launcher(cls, context: bpy.types.Context) -> None:
assert context.region
ui_context = context.region.type ui_context = context.region.type
props = tool.Model.get_model_props() props = tool.Model.get_model_props()
row = cls.layout.row(align=True) row = cls.layout.row(align=True)
@@ -568,7 +570,8 @@ class CreateObjectUI:
op.ifc_element_type = AuthoringData.data["ifc_element_type"] op.ifc_element_type = AuthoringData.data["ifc_element_type"]
@classmethod @classmethod
def draw_add_object(cls, context): def draw_add_object(cls, context: bpy.types.Context) -> None:
assert context.region
ui_context = str(context.region.type) ui_context = str(context.region.type)
row = cls.layout.row(align=True) row = cls.layout.row(align=True)
if AuthoringData.data["relating_type_id"]: if AuthoringData.data["relating_type_id"]:
@@ -580,7 +583,8 @@ class CreateObjectUI:
row.label(text="No Construction Type", icon="FILE_3D") row.label(text="No Construction Type", icon="FILE_3D")
@classmethod @classmethod
def draw_add_object_parameters(cls, context): def draw_add_object_parameters(cls, context: bpy.types.Context) -> None:
assert context.region
ui_context = str(context.region.type) ui_context = str(context.region.type)
row = cls.layout.row(align=True) row = cls.layout.row(align=True)
if not AuthoringData.data["relating_type_id"]: if not AuthoringData.data["relating_type_id"]:
@@ -633,7 +637,8 @@ class CreateObjectUI:
row.prop(data=cls.props, property="rl_mode", text="RL Mode" if ui_context != "TOOL_HEADER" else "RL") row.prop(data=cls.props, property="rl_mode", text="RL Mode" if ui_context != "TOOL_HEADER" else "RL")
@classmethod @classmethod
def draw_thumbnail(cls, context): def draw_thumbnail(cls, context: bpy.types.Context) -> None:
assert context.region
ui_context = context.region.type ui_context = context.region.type
row = cls.layout.row(align=True) row = cls.layout.row(align=True)
if not AuthoringData.data["ifc_element_type"]: if not AuthoringData.data["ifc_element_type"]:
@@ -52,7 +52,6 @@ def get_named_unit_types(self: "BIMUnitProperties", context: bpy.types.Context)
class Unit(PropertyGroup): class Unit(PropertyGroup):
name: StringProperty(name="Name")
unit_type: StringProperty(name="Unit Type") unit_type: StringProperty(name="Unit Type")
is_assigned: BoolProperty(name="Is Assigned") is_assigned: BoolProperty(name="Is Assigned")
ifc_class: StringProperty(name="IFC Class") ifc_class: StringProperty(name="IFC Class")
+16 -1
View File
@@ -16,11 +16,17 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with Bonsai. If not, see <http://www.gnu.org/licenses/>. # along with Bonsai. If not, see <http://www.gnu.org/licenses/>.
from __future__ import annotations
import bonsai.bim.helper import bonsai.bim.helper
import bonsai.tool as tool import bonsai.tool as tool
import bpy
from bpy.types import Panel, UIList from bpy.types import Panel, UIList
from bonsai.bim.helper import prop_with_search from bonsai.bim.helper import prop_with_search
from bonsai.bim.module.unit.data import UnitsData from bonsai.bim.module.unit.data import UnitsData
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bonsai.bim.module.unit.prop import BIMUnitProperties, Unit
class BIM_PT_units(Panel): class BIM_PT_units(Panel):
@@ -102,7 +108,16 @@ class BIM_PT_units(Panel):
class BIM_UL_units(UIList): class BIM_UL_units(UIList):
def draw_item(self, context, layout, data, item, icon, active_data, active_propname): def draw_item(
self,
context,
layout: bpy.types.UILayout,
data: BIMUnitProperties,
item: Unit,
icon_: int,
active_data,
active_propname,
) -> None:
props = tool.Unit.get_unit_props() props = tool.Unit.get_unit_props()
if item: if item:
icon = "MOD_MESHDEFORM" icon = "MOD_MESHDEFORM"
+13 -13
View File
@@ -26,7 +26,7 @@ if TYPE_CHECKING:
import bonsai.tool as tool import bonsai.tool as tool
def assign_scene_units(ifc: tool.Ifc, unit: tool.Unit) -> None: def assign_scene_units(ifc: type[tool.Ifc], unit: type[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)
@@ -44,66 +44,66 @@ def assign_scene_units(ifc: tool.Ifc, unit: tool.Unit) -> None:
ifc.run("unit.assign_unit", units=[lengthunit, areaunit, volumeunit, planeangleunit]) ifc.run("unit.assign_unit", units=[lengthunit, areaunit, volumeunit, planeangleunit])
def assign_unit(ifc: tool.Ifc, unit_tool: tool.Unit, unit: ifcopenshell.entity_instance) -> None: def assign_unit(ifc: type[tool.Ifc], unit_tool: type[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: tool.Ifc, unit_tool: tool.Unit, unit: ifcopenshell.entity_instance) -> None: def unassign_unit(ifc: type[tool.Ifc], unit_tool: type[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: tool.Unit) -> None: def load_units(unit: type[tool.Unit]) -> None:
unit.import_units() unit.import_units()
unit.enable_editing_units() unit.enable_editing_units()
def disable_unit_editing_ui(unit: tool.Unit) -> None: def disable_unit_editing_ui(unit: type[tool.Unit]) -> None:
unit.disable_editing_units() unit.disable_editing_units()
def remove_unit(ifc: tool.Ifc, unit_tool: tool.Unit, unit: ifcopenshell.entity_instance) -> None: def remove_unit(ifc: type[tool.Ifc], unit_tool: type[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: tool.Ifc, unit: tool.Unit) -> ifcopenshell.entity_instance: def add_monetary_unit(ifc: type[tool.Ifc], unit: type[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: tool.Ifc, unit: tool.Unit, unit_type: str) -> ifcopenshell.entity_instance: def add_si_unit(ifc: type[tool.Ifc], unit: type[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( def add_context_dependent_unit(
ifc: tool.Ifc, unit: tool.Unit, unit_type: str, name: str ifc: type[tool.Ifc], unit: type[tool.Unit], unit_type: str, name: str
) -> ifcopenshell.entity_instance: ) -> 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: tool.Ifc, unit: tool.Unit, name: str) -> ifcopenshell.entity_instance: def add_conversion_based_unit(ifc: type[tool.Ifc], unit: type[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: tool.Unit, unit: ifcopenshell.entity_instance) -> None: def enable_editing_unit(unit_tool: type[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: tool.Unit) -> None: def disable_editing_unit(unit: type[tool.Unit]) -> None:
unit.clear_active_unit() unit.clear_active_unit()
def edit_unit(ifc: tool.Ifc, unit_tool: tool.Unit, unit: ifcopenshell.entity_instance) -> None: def edit_unit(ifc: type[tool.Ifc], unit_tool: type[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)
+1 -1
View File
@@ -125,7 +125,7 @@ class Unit(bonsai.core.tool.Unit):
props = tool.Unit.get_unit_props() props = tool.Unit.get_unit_props()
props.units.clear() props.units.clear()
units = [] units: list[ifcopenshell.entity_instance] = []
for unit_class in ["IfcDerivedUnit", "IfcMonetaryUnit", "IfcNamedUnit"]: for unit_class in ["IfcDerivedUnit", "IfcMonetaryUnit", "IfcNamedUnit"]:
units += tool.Ifc.get().by_type(unit_class) units += tool.Ifc.get().by_type(unit_class)
@@ -695,6 +695,7 @@ def calculate_unit_scale(ifc_file: ifcopenshell.file, unit_type: str = "LENGTHUN
if not (projects := ifc_file.by_type("IfcProject")) or not (units := projects[0].UnitsInContext): if not (projects := ifc_file.by_type("IfcProject")) or not (units := projects[0].UnitsInContext):
return 1 return 1
unit_scale = 1 unit_scale = 1
unit: ifcopenshell.entity_instance
for unit in units.Units: for unit in units.Units:
if not hasattr(unit, "UnitType") or unit.UnitType != unit_type: if not hasattr(unit, "UnitType") or unit.UnitType != unit_type:
continue continue