diff --git a/src/bonsai/bonsai/bim/handler.py b/src/bonsai/bonsai/bim/handler.py index b9194e84ed..c7114373bf 100644 --- a/src/bonsai/bonsai/bim/handler.py +++ b/src/bonsai/bonsai/bim/handler.py @@ -33,6 +33,7 @@ from bonsai.bim.module.model.workspace import LIST_OF_TOOLS, TOOLS_TO_CLASSES_MA from bonsai.bim.module.aggregate.decorator import AggregateDecorator from bonsai.bim.module.georeference.decorator import GeoreferenceDecorator from bonsai.bim.module.model.decorator import WallAxisDecorator, SlabDirectionDecorator +from bonsai.bim.module.nest.decorator import NestDecorator from mathutils import Vector from math import cos, degrees from typing import Union, Callable @@ -323,11 +324,14 @@ def load_post(scene): # Bonsai overlays georeference_props = bpy.context.scene.BIMGeoreferenceProperties aggregate_props = bpy.context.scene.BIMAggregateProperties + nest_props = bpy.context.scene.BIMNestProperties model_props = bpy.context.scene.BIMModelProperties - if aggregate_props.aggregate_decorator: - AggregateDecorator.install(bpy.context) if georeference_props.should_visualise: GeoreferenceDecorator.install(bpy.context) + if aggregate_props.aggregate_decorator: + AggregateDecorator.install(bpy.context) + if nest_props.nest_decorator: + NestDecorator.install(bpy.context) if model_props.show_wall_axis: WallAxisDecorator.install(bpy.context) if model_props.show_slab_direction: diff --git a/src/bonsai/bonsai/bim/module/aggregate/decorator.py b/src/bonsai/bonsai/bim/module/aggregate/decorator.py index 1fced74817..a7f9f41658 100644 --- a/src/bonsai/bonsai/bim/module/aggregate/decorator.py +++ b/src/bonsai/bonsai/bim/module/aggregate/decorator.py @@ -167,6 +167,8 @@ class AggregateDecorator: theme = context.preferences.themes.items()[0][1] selected_object_color = (*theme.view_3d.object_active, 1) + self.shader = gpu.shader.from_builtin("UNIFORM_COLOR") + self.shader.bind() self.line_shader = gpu.shader.from_builtin("POLYLINE_UNIFORM_COLOR") self.line_shader.bind() # POLYLINE_UNIFORM_COLOR specific uniforms diff --git a/src/bonsai/bonsai/bim/module/nest/decorator.py b/src/bonsai/bonsai/bim/module/nest/decorator.py index 7628219215..3dd85bf09b 100644 --- a/src/bonsai/bonsai/bim/module/nest/decorator.py +++ b/src/bonsai/bonsai/bim/module/nest/decorator.py @@ -86,7 +86,7 @@ class NestDecorator: if cls.is_installed: cls.uninstall() handler = cls() - cls.handlers.append(SpaceView3D.draw_handler_add(handler.draw_aggregate, (context,), "WINDOW", "POST_VIEW")) + cls.handlers.append(SpaceView3D.draw_handler_add(handler.draw_nest, (context,), "WINDOW", "POST_VIEW")) cls.is_installed = True @classmethod @@ -153,8 +153,8 @@ class NestDecorator: shader.uniform_float("color", color) batch.draw(shader) - def draw_aggregate(self, context): - if context.scene.BIMAggregateProperties.in_aggregate_mode: + def draw_nest(self, context): + if context.scene.BIMNestProperties.in_nest_mode: return self.addon_prefs = tool.Blender.get_addon_preferences() decorator_color_special = self.addon_prefs.decorator_color_special @@ -165,11 +165,13 @@ class NestDecorator: theme = context.preferences.themes.items()[0][1] selected_object_color = (*theme.view_3d.object_active, 1) + self.shader = gpu.shader.from_builtin("UNIFORM_COLOR") + self.shader.bind() self.line_shader = gpu.shader.from_builtin("POLYLINE_UNIFORM_COLOR") self.line_shader.bind() # POLYLINE_UNIFORM_COLOR specific uniforms self.line_shader.uniform_float("viewportSize", (context.region.width, context.region.height)) - aggregates = [] + nests = [] if not (selected_objects := context.selected_objects): return for obj in selected_objects: @@ -177,35 +179,39 @@ class NestDecorator: if not element or not element.is_a("IfcElement"): return - parts = ifcopenshell.util.element.get_parts(element) - if parts: - aggregates.append(obj) + components = ifcopenshell.util.element.get_components(element) + if components: + nests.append(obj) continue - aggregate = ifcopenshell.util.element.get_aggregate(element) - if aggregate: - aggregates.append(tool.Ifc.get_object(aggregate)) + nest = ifcopenshell.util.element.get_nest(element) + if nest: + nests.append(tool.Ifc.get_object(nest)) - aggregates = set(aggregates) - for aggregate in aggregates: + nests = set(nests) + for nest in nests: self.line_shader.uniform_float("lineWidth", 1.0) color = decorator_color_unselected - if aggregate in selected_objects: + if nest in selected_objects: color = selected_object_color - size = aggregate.empty_display_size - location = aggregate.location - line_x = (location - Vector((size, 0.0, 0.0)), location + Vector((size, 0.0, 0.0))) - self.draw_batch("LINES", line_x, color, [(0, 1)]) - line_y = (location - Vector((0.0, size, 0.0)), location + Vector((0.0, size, 0.0))) - self.draw_batch("LINES", line_y, color, [(0, 1)]) - line_z = (location - Vector((0.0, 0.0, size)), location + Vector((0.0, 0.0, size))) - self.draw_batch("LINES", line_z, color, [(0, 1)]) - if context.scene.BIMAggregateProperties.in_aggregate_mode: - return - parts = ifcopenshell.util.element.get_parts(tool.Ifc.get_entity(aggregate)) - parts_objs = [tool.Ifc.get_object(p) for p in parts] + size = nest.empty_display_size + location = nest.location + if nest.type == "EMPTY": + line_x = (location - Vector((size, 0.0, 0.0)), location + Vector((size, 0.0, 0.0))) + self.draw_batch("LINES", line_x, color, [(0, 1)]) + line_y = (location - Vector((0.0, size, 0.0)), location + Vector((0.0, size, 0.0))) + self.draw_batch("LINES", line_y, color, [(0, 1)]) + line_z = (location - Vector((0.0, 0.0, size)), location + Vector((0.0, 0.0, size))) + self.draw_batch("LINES", line_z, color, [(0, 1)]) + else: + self.draw_batch("POINTS", [location], color) + # if context.scene.BIMNestProperties.in_aggregate_mode: + # return + components = ifcopenshell.util.element.get_components(tool.Ifc.get_entity(nest)) + components_objs = [tool.Ifc.get_object(p) for p in components] + components_objs.append(nest) - indices, edges = create_bounding_box(parts_objs) + indices, edges = create_bounding_box(components_objs) self.line_shader.uniform_float("lineWidth", 0.5) self.draw_batch("LINES", indices, color, edges) line = (Vector(indices[0]), location) diff --git a/src/bonsai/bonsai/bim/ui.py b/src/bonsai/bonsai/bim/ui.py index 42742fb1de..890e022684 100644 --- a/src/bonsai/bonsai/bim/ui.py +++ b/src/bonsai/bonsai/bim/ui.py @@ -1209,8 +1209,9 @@ class BIM_PT_decorators_overlay(Panel): view = context.space_data overlay = view.overlay - geo_props = bpy.context.scene.BIMGeoreferenceProperties - agg_props = bpy.context.scene.BIMAggregateProperties + georeference_props = bpy.context.scene.BIMGeoreferenceProperties + aggregate_props = bpy.context.scene.BIMAggregateProperties + nest_props = bpy.context.scene.BIMNestProperties model_props = bpy.context.scene.BIMModelProperties display_all = overlay.show_overlays @@ -1218,10 +1219,12 @@ class BIM_PT_decorators_overlay(Panel): col.active = display_all row = col.row(align=True) - row.prop(geo_props, "should_visualise", text="Georeference") - row.prop(geo_props, "visualization_scale", text="Size", slider=True) + row.prop(georeference_props, "should_visualise", text="Georeference") + row.prop(georeference_props, "visualization_scale", text="Size", slider=True) row = col.row(align=True) - row.prop(agg_props, "aggregate_decorator", text="Aggregate") + row.prop(aggregate_props, "aggregate_decorator", text="Aggregate") + row = col.row(align=True) + row.prop(nest_props, "nest_decorator", text="Nest") row = col.row(align=True) row.prop(model_props, "show_wall_axis", text="Wall Axis") row = col.row(align=True)